创建组件时,可以指定其停靠在某个父窗口之上。这时组件将作为子窗口被束缚于其父窗口之内,并随父窗口一起移动、隐藏、显示和关闭,否则该组件将作为独立窗口显示在屏幕上,且游离于其它窗口之外。
任何QWidget类及其子类的对象,都可以做为其它组件的父窗口。常见的被用做父窗口的类有三个,它们是QWidget、QMainWindow和QDialog。
作为子窗口的容器,父窗口的析构函数将负责销毁其所有的子窗口。即使这些子窗口是通过new操作符动态创建的,也不必显式地通过delete操作符销毁它们。只要父窗口被销毁了,其中的所有子窗口也就随之被销毁了,完全无需担心内存泄漏问题。
无论是父窗口还是子窗口,都可以通过其move和resize方法,设置窗口的位置和大小:
xxxxxxxxxx
21void move(int x, int y);
2void resize(int w, int h);
move方法的两个参数分别表示窗口矩形左上角的水平和垂直坐标。顶层窗口使用屏幕坐标系,其它窗口使用其父窗口的窗口坐标系。屏幕坐标系的坐标原点位于屏幕矩形的左上角,窗口坐标系的坐标原点位于窗口矩形的左上角。屏幕坐标系和窗口坐标系的
在父窗口中放置子窗口。
C:\Users\Minwei\Projects\Qt\Parent\main.cpp:
xxxxxxxxxx
401
2
3
4
5
6
7
8int main(int argc, char* argv[])
9{
10 // 创建应用对象
11 QApplication app(argc, argv);
12
13 // 创建父窗口
14 QWidget parent;
15 //QMainWindow parent;
16 //QDialog parent;
17 parent.move(500, 400); // 设置父窗口的位置
18 parent.resize(300, 150); // 设置父窗口的大小
19
20 // 创建标签组件
21 QLabel label("我是快乐的子窗口:)", &parent);
22 label.move(80, 30); // 设置子窗口的位置
23 label.resize(140, 30); // 设置子窗口的大小
24
25 // 创建确定按钮
26 QPushButton btnOk("确定", &parent);
27 btnOk.move(35, 90); // 设置子窗口的位置
28 btnOk.resize(100, 30); // 设置子窗口的大小
29
30 // 创建取消按钮
31 QPushButton* btnCancel = new QPushButton("取消", &parent);
32 btnCancel->move(165, 90); // 设置子窗口的位置
33 btnCancel->resize(100, 30); // 设置子窗口的大小
34
35 // 显示父窗口
36 parent.show();
37
38 // 进入事件循环
39 return app.exec();
40}
运行效果如图所示: