我创建了一个非常简单的QWidget子类,如下所示:
class WorldView : public QWidget
{
Q_OBJECT
public:
explicit WorldView(QWidget *parent = 0);
signals:
public slots:
};
WorldView::WorldView(QWidget *parent) : QWidget(parent)
{
}
我在主窗口中创建了一个实例,如下所示:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
virtual void resizeEvent(QResizeEvent* event) override;
private:
WorldView* _worldView;
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
_worldView = new WorldView(this);
_worldView->setStyleSheet(QString("* {background-color : black}"));
}
MainWindow::~MainWindow()
{
delete _worldView;
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
_worldView->resize(size());
}
但是小部件没有按预期显示。
我曾尝试拨打show()
,但仍未显示。
奇怪的是,当我用WorldView
替换QWidget
时,小部件会显示。
我不知道为什么。
答案 0 :(得分:2)
因为样式表不适用于自定义QWidget子类。
来自https://doc.qt.io/qt-5/stylesheet-reference.html:
QWidget
仅支持背景,背景剪辑和背景原点属性。
如果您是QWidget的子类,则需要为自定义QWidget提供一个paintEvent,如下所示:
void CustomWidget::paintEvent(QPaintEvent *) { QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); }
如果没有设置样式表,上面的代码是无操作的。
警告:确保为自定义小部件定义Q_OBJECT宏。
(并且,通常,停止使用样式表。)