在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