QWidget之Alien與Native小記(果然是DirectUI的方式,QWidget居然提供了nativeParentWidget函數,而且可以動態設置native父窗口)good


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

 

 

http://blog.csdn.net/dbzhang800/article/details/7006270


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM