QWidget 派生类不可见

Posted

技术标签:

【中文标题】QWidget 派生类不可见【英文标题】:QWidget derived class is not visible 【发布时间】:2011-11-23 17:30:01 【问题描述】:

我可以在主窗口类的功能之一中创建并查看 QWidget:

..
// ok
QWidget *w = new QWidget(this);
w->setGeometry(400,300,400,300);
w->setStyleSheet("background-color:white;");
w->show();
..

但是当我尝试通过创建另一个派生自 QWidget 的类来做类似的事情时,我什么也看不到:

class MyWidget : public QWidget

        public:
        MyWidget(QWidget *sParent):QWidget(sParent)
        
        
;

        ..
        // nothing visible happens.
        MyWidget *w = new MyWidget(this);
        w->setGeometry(400,300,400,300);
        w->setStyleSheet("background-color:white;");
        w->show();
        ..

这可能是什么原因?

注意:关于这个问题的一切:http://pastebin.com/haCHfqnu

【问题讨论】:

这就像唯一的代码 Dave。很容易重现这种情况。但我正在添加完整的问题来源。 【参考方案1】:

你可以重写paintEvent。

void MyWidget::paintEvent(QPaintEvent *event)

    QWidget::paintEvent(event);
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);

我认为这会解决问题。

【讨论】:

但我不明白:当我从 QWidget 派生 MyWidget 时,我没有覆盖 QWidget 的任何函数。基本上这意味着将调用函数的基类版本。所以它应该和普通的 QWidget 完全一样 我认为这是一个错误。只有 QWidget 有这种奇怪的行为。如果您创建其他的小部件国王,如 QTextEdit 或 QPushButton,它们的行为将与原始类一样。 这里有一些解释:falsinsoft.blogspot.com/2015/02/… "如果你直接从 QWidget 对象派生你的类,并且想为自定义界面应用一些样式表标签,你会发现你的样式表设置不起作用。只是一个简单地设置背景颜色的样式表标签如下不会有任何效果:"

以上是关于QWidget 派生类不可见的主要内容,如果未能解决你的问题,请参考以下文章

派生类不从基类继承重载方法

派生类不被识别为协变

如何处理与派生类不兼容的基类方法?

缺少带有 QObject 的派生类

C++入门派生类和基类的构造/析构函数关系

QT编程,如何把自定义的QWidget的一个派生类放入Qlayout中,不能显示了。