首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QGridLayout addWidget(CustomWidget)不工作

QGridLayout addWidget(CustomWidget)不工作
EN

Stack Overflow用户
提问于 2019-05-06 06:15:10
回答 1查看 617关注 0票数 1

我在代码中使用QGridLayout,并希望将我的自定义小部件添加到网格布局中,它不适用于addWidget(CustomWidget*)

这是使用Visual 2013和Qt5.6.3在Windows10上运行的。

代码语言:javascript
复制
// *.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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-06 08:01:06

正如Qt的样式表引用中所述,将CSS样式应用于从QWidget继承的自定义小部件需要以这种方式重新实现paintEvent()

代码语言:javascript
复制
     void CustomWidget::paintEvent(QPaintEvent *)
     {
         QStyleOption opt;
         opt.init(this);
         QPainter p(this);
         style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
     }

尽管它在文档中说了什么,但如果不这样做,您的自定义小部件将只支持背景、背景剪辑和背景源属性,这可能是一个bug。

您可以在这里了解到:Qt样式表参考在“可手写小部件列表”-> QWidget一节中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55999683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档