本文主要是介绍QWidget之Alien与Native小记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在QWidget 之paint部分杂记提到了从Qt4.4开始,Alien Widget被引入。那么...这是什么东西呢,我们在使用中又可能会感受到什么东西?
用例子来说话似乎比用源码来说话来得容易,所以看例子:
例子
一个小例子: 创建 a -> b -> c -> d -> e 共5个widget
考虑它们各自的
- parentWidget()
- nativeParentWidget()
- window()
分别返回什么呢?
#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"
列成表格
name | "A" | "B" | "C" | "D" | "E" |
parentWidget() | 0 | "A" | "B" | "C" | "D" |
nativeParentWidget() | 0 | "A" | "A" | "A" | "A" |
window() | "A" | "A" | "A" | "A" | "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个:
QWidget::parentWidget () | 最普通的东西,当前widget的父亲 |
QWidget::window () | 当前widget所在的窗口,顶级窗口 |
QWidget::nativeParentWidget () | 离自己最近的且是native的祖先 |
密切相关的还有2个:
QWidget::winId () | 如果当前Widget不是native,则先自动变成native,再返回ID |
QWidget::effectiveWinId () | 有效ID,如果不是native,则返回nativeParentWidget的ID |
再就是:QWidget中有个废弃的成员
-
QWidget::topLevelWidget ()
它和QWidget::window()同义。尽管没什么用了,但对我们理解一些东西可能有用。
topLevelWidget <==> window
这篇关于QWidget之Alien与Native小记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!