qgridlayout addwidget(customwidget)不起作用

QGridLayout addWidget(CustomWidget) is not working

本文关键字:不起作用 customwidget addwidget qgridlayout      更新时间:2023-10-16

我正在使用代码中的 QGridLayout,并希望将我的自定义窗口小部件添加到gridlayout,它不使用addWidget(CustomWidget*)

这是在Windows10上使用Visual Studio 2013和QT5.6.3。

在Windows10上运行
// *.h
class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = Q_NULLPTR);
private:
    Ui::MainWindow ui;
};
class CustomWidget : public QWidget {
    Q_OBJECT
public:
    CustomWidget(QWidget *parent = Q_NULLPTR) : QWidget(parent) {}
    ~CustomWidget() {}
};
// *.cpp
// when i use CustomWidget
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    ui.setupUi(this);
    QWidget *grid = new QWidget(this);
    grid->setStyleSheet("background:pink;");
    QGridLayout *layout = new QGridLayout(grid);
    layout->setMargin(0);
    layout->setSpacing(0);
    grid->setLayout(layout);
    grid->setGeometry(500, 150, 240, 180);
    // following code is not working, when run this program, 
    // i can only see the 'grid' widget with pink background
    CustomWidget *w = new CustomWidget(grid);
    w->setStyleSheet("background:red;");
    layout->addWidget(w, 0, 0);
}
// but if i use QWidget
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    ui.setupUi(this);
    QWidget *grid = new QWidget(this);
    grid->setStyleSheet("background:pink;");
    QGridLayout *layout = new QGridLayout(grid);
    layout->setMargin(0);
    layout->setSpacing(0);
    grid->setLayout(layout);
    grid->setGeometry(500, 150, 240, 180);
    // following code is working, when run this program, 
    // i can see the 'w' widget with red background
    QWidget *w = new QWidget(grid);
    w->setStyleSheet("background:red;");
    layout->addWidget(w, 0, 0);
}

正如QT的样式表参考中所说的那样,将CSS样式应用于从Qwidget继承的自定义小部件,需要以这种方式重新进来paintEvent()

     void CustomWidget::paintEvent(QPaintEvent *)
     {
         QStyleOption opt;
         opt.init(this);
         QPainter p(this);
         style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
     }

尽管对于文档中所说的话,您的自定义小部件将仅支持背景,背景clip和背景 - 原始属性,可能是一个错误。

您可以在此处阅读有关它的信息:QT Stylesheets参考"样式窗口列表" -> Qwidget。