在QWidget 之paint部分杂记提到了从Qt4.4开始,Alien Widget被引入。那么...这是什么东西呢,我们在使用中又可能会感受到什么东西? 用例子来说话似乎比用源码来说话来得容易,所以看例子: 例子一个小例子: 创建 a -> b -> c -> d -> e 共5个widget 考虑它们各自的
分别返回什么呢? #include <QtGui> #include <QtCore> class Widget:public QWidget { public: Widget(const QString& name, QWidget *parent=0) :QWidget(parent) { setProperty("name", name); } protected: void showEvent(QShowEvent *) { qDebug()<<"name:"<<property("name").toString(); if (parentWidget()) qDebug()<<" parent:" <<parentWidget()->property("name").toString(); if (nativeParentWidget()) qDebug()<<" nativeParent:" <<nativeParentWidget()->property("name").toString(); qDebug()<<" window:"<<window()->property("name").toString(); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); Widget a("A"); Widget b("B", &a); Widget c("C", &b); Widget d("D", &c); Widget e("E", &d); a.show(); return app.exec(); } 结果如下name: "E" parent: "D" nativeParent: "A" window: "A" name: "D" parent: "C" nativeParent: "A" window: "A" name: "C" parent: "B" nativeParent: "A" window: "A" name: "B" parent: "A" nativeParent: "A" window: "A" name: "A" window: "A" 列成表格
parentWidget()和window()应该没什么问题,nativeParentWidget()可能会让人费解 如果在main函数内加上一行 app.setAttribute(Qt::AA_NativeWindows); 那么,nativeParentWidget()就会和parentWidget()保持一致了。 如果main函数内加一行 c.setAttribute(Qt::WA_NativeWindow); 或者是 c.setAttribute(Qt::WA_NativeWindow); c.setAttribute(Qt::WA_DontCreateNativeAncestors); 又可以得到不同但是很有意思的结果。 原因?之所以会有这些东西,就是因为从Qt4.4开始,Alien Widget被引入了,且比native Widget更有优势。 在这个例子中,只有a是native的(因为它是顶级窗口,是window,必须如此),其他的b/c/d/e默认均是alien的。如果真有需要,我们可以有选择的设置某个widget或所有widget均是native的。 QWidget几个成员前面例子中我们看了3个:
密切相关的还有2个:
再就是:QWidget中有个废弃的成员
它和QWidget::window()同义。尽管没什么用了,但对我们理解一些东西可能有用。 topLevelWidget <==> window |
|