QWidget 的简单子类不能用作 QWidget

A simple subclass of QWidget doesn't work as a QWidget

本文关键字:QWidget 不能 子类 简单      更新时间:2023-10-16

我创建了一个非常简单的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(),但它仍然没有显示。

奇怪的是,当我用QWidget代替WorldView时,小部件显示出来了。

我不知道为什么

因为样式表对自定义QWidget子类不起作用。

From https://doc.qt.io/qt-5/stylesheet-reference.html:

QWidget

只支持background, background-clip和background-origin属性。

如果您从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宏。

(一般来说,停止使用样式表)