• 5294阅读
  • 8回复

又一个非常非常简单而又诡异的现象...就直接继承了QWidget,什么也没有添加...也不正常? [复制链接]

上一主题 下一主题
离线iiiyyyhhhsss
 

只看楼主 倒序阅读 楼主  发表于: 2010-05-21
情况一:

完全正常:

#include <QtGui>
int main(int argc,char* argv[])
{
    QApplication app(argc,argv);

    QWidget w(0);     w.setStyleSheet("background-color:yellow;");         w.resize(200,200);              w.show();

    QWidget ww(&w);          ww.setStyleSheet("background-color:green;");          ww.setGeometry(0,0,100,100);          ww.show();

    return app.exec();
}

****************************
情况二:

诡异现象:

main.cpp:--------------------------
#include <QtGui>

class CCQWidget : public QWidget
{
    Q_OBJECT
    public:
    CCQWidget(QWidget *parent);
    virtual ~CCQWidget();
};

CCQWidget::~CCQWidget() {}
CCQWidget::CCQWidget(QWidget *parent)
        : QWidget(parent)    {}



int main(int argc,char* argv[])
{
    QApplication app(argc,argv);

    QWidget w(0);            w.setStyleSheet("background-color:yellow;");             w.resize(200,200);                w.show();

    CCQWidget ww(&w);               ww.setStyleSheet("background-color:green;");             ww.setGeometry(0,0,100,100);             ww.show();

    return app.exec();
}
[ 此帖被iiiyyyhhhsss在2010-05-22 15:50重新编辑 ]
离线luoyes

只看该作者 1楼 发表于: 2010-05-24
好像是需要包含一下moc文件,
再者你也没说这事件诡异在哪啊?
离线浪漫天使
只看该作者 2楼 发表于: 2010-05-24
要独立的头文件
  1. class CCQWidget : public QWidget
  2. {
  3.     Q_OBJECT
  4.     public:
  5.     CCQWidget(QWidget *parent);
  6.     virtual ~CCQWidget();
  7. };
  8. CCQWidget::~CCQWidget() {}
  9. CCQWidget::CCQWidget(QWidget *parent)
  10.         : QWidget(parent)    {}

应该放在一个头文件中
离线paranoid
只看该作者 3楼 发表于: 2010-05-24
诡异之处在于使用自定义的qwideg子类没有画出来,而直接使用qwidget是可以的。
试了试别的widget子类都没问题,看来有可能是qt的bug
离线hgamesale
只看该作者 4楼 发表于: 2010-05-24
直接继承QWidget   这样的两个窗口都是顶级窗口,是不能并存的,要设置WindowFlag,
在你第二构造之后加下如下语句,
CCQWidget ww(&w);
ww.setWindowFlags(Qt::Dialog);
就可以了
离线paranoid
只看该作者 5楼 发表于: 2010-05-24
第二个widget指定了parent为第一个widget,所以它不是顶级的
离线iiiyyyhhhsss

只看该作者 6楼 发表于: 2010-05-24
以上的,暂时都不能解决问题....
离线paranoid
只看该作者 7楼 发表于: 2010-05-24
show()之后加上一句
setAutoFillBackground(true);
这样倒是可以,如果仅仅是为了解决这个问题的话
离线iiiyyyhhhsss

只看该作者 8楼 发表于: 2010-05-24
引用第7楼paranoid于2010-05-24 14:46发表的  :
show()之后加上一句
setAutoFillBackground(true);
这样倒是可以,如果仅仅是为了解决这个问题的话



我可是找到了原因了(注意红色):

autoFillBackground : bool
This property holds whether the widget background is filled automatically.

If enabled, this property will cause Qt to fill the background of the widget before invoking the paint event. The color used is defined by the QPalette::Window color role from the widget's palette.

In addition, Windows are always filled with QPalette::Window, unless the WA_OpaquePaintEvent or WA_NoSystemBackground attributes are set.

This property cannot be turned off (i.e., set to false) if a widget's parent has a static gradient for its background.

Warning: Use this property with caution in conjunction with Qt Style Sheets. When a widget has a style sheet with a valid background or a border-image, this property is automatically disabled.
快速回复
限100 字节
 
上一个 下一个