QWidget的一个简单子类不能用作QWidget

时间:2016-08-15 16:18:03

标签: c++ qt

我创建了一个非常简单的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时,小部件会显示。

我不知道为什么。

1 个答案:

答案 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宏。

(并且,通常,停止使用样式表。)