码迷,mamicode.com
首页 > 其他好文 > 详细

QWidget之Alien与Native小记(果然是DirectUI的方式,QWidget居然提供了nativeParentWidget函数,而且可以动态设置native父窗口)good

时间:2017-12-14 21:05:21      阅读:366      评论:0      收藏:0      [点我收藏+]

标签:mct   window   argc   public   protect   create   有用   pre   win   

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

QWidget之Alien与Native小记(果然是DirectUI的方式,QWidget居然提供了nativeParentWidget函数,而且可以动态设置native父窗口)good

标签:mct   window   argc   public   protect   create   有用   pre   win   

原文地址:http://www.cnblogs.com/findumars/p/8039333.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!