• 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

  • 相关阅读:
    使用 Docker 安装 Jenkins 的最佳方式
    使用 Docker 在 Linux 上托管 ASP.NET Core 应用程序
    分布式缓存 Redis 集群搭建
    [译]RabbitMQ教程C#版
    如何解决 React 官方脚手架不支持 Less 的问题
    [译]RabbitMQ教程C#版
    [译]RabbitMQ教程C#版
    快速签发 Let's Encrypt 证书指南
    [译]RabbitMQ教程C#版
    [译]RabbitMQ教程C#版
  • 原文地址:https://www.cnblogs.com/findumars/p/8039333.html
Copyright © 2020-2023  润新知