QT快速学习笔记——在组件之上显示另一个组件

Parenting system介绍

这是我要介绍的QT程序的第一个重要的概念——Parenting system,原谅我不知道怎么翻译=_=。

这个机制的实现由QObject类提供,该类是QT中绝大部分组件的基类。QT中类的关系简图如下:

可以看到,我们在上一节中所使用的QPushButton组件也继承自QObject类,所以该组件也支持Parenting system机制。

代码演示

接下来我将通过一段代码来演示Parenting system机制的作用:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton *button1 = new QPushButton("Hello World");
    // 实例化button2,在构造函数的第二个参数中填入button1的地址
    // 此时button2就是button1的子组件
    QPushButton *button2 = new QPushButton("Hi", button1);

    // 只需要显示父组件,其下的子组件就会一同显示
    // 另外子组件也不需要单独调用delete(),他会随着父组件一起被释放
    button1->show();

    return a.exec();
}

运行后显示是这样的:

我们将窗体拉大,变成如下:

解读

可以看到,button2是显示在了button1的上面。这就很实际了,因为我们常见的Windows窗体都是在一个组件上叠加其他组件来显示的,例如:

每一个颜色的框框代表一个组件(没有把所有组件都标记出来,只摘取部分说明问题)。可以发现这样一个很复杂的窗体,就是一个面积很大的组件上面无限层次的叠加小组件来最终实现的。

而维护这种组件之间的父子关系的方法就是我们本篇文章所介绍的——Parenting system机制。

但是我们刚刚的程序还存在一个问题,就是父组件button1是一个按钮,试想一下如果把button1换成一个显示空白的组件是不是会更好一些?相关内容将在下一篇文章中详述。

Leave a Reply

Your email address will not be published. Required fields are marked *

Captcha Code