网站首页 > 技术文章 正文
?2.1.1 窗口定义
窗口:当一个部件没有嵌入到其他部件中,则把这个部件叫作窗口或者顶层窗口,顶层窗口是没有父窗口的,一般的,这些窗口都会被列在任务栏中。
通常,一个窗口会包含有标题栏,窗口边框等。
如果一个窗口具有父类,则这个窗口被称为是次级窗口,例如设置了父类的QDialog就是次级窗口,而这些窗口不会被列在任务栏中,而是在各自的父窗口之上。
控件:当一个窗口嵌入到其它窗口中,则它本身的标题栏会隐藏,那这些窗口就叫作控件,也可以叫作非顶层窗口或子窗口。
父窗口,子窗口:当部件1嵌入到部件2中,就把部件2称作是部件1的父窗口,而部件1是部件2的子窗口。
下图,MyFirstWidget是窗口,TextLabel,ComboBox,PushButton,LineEdit,CheckBox等都是控件,并且它们的父窗口是MyFirstWidget。
在Qt中主要有三种顶层窗口:
QWidget:最基础的窗口,所有窗口及控件都继承QWidget。
QDialog:对话框窗口,可类比Windows中的对话框。
QMainWindow:主窗口,一般主窗口会包括标题栏,菜单栏,工具栏,中心部件,停靠窗口,状态栏等。可类比桌面应用程序。
2.1.2 验证父子窗口
新建项目ParentChildWidget,类名ParentChildWidget,基类选择QWidget。
在main.cpp包含QPushButton,输入如下代码
#include "parentchildwidget.h"
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ParentChildWidget w;
w.show();
QPushButton buttonWindow;
buttonWindow.setText("我是窗口");
buttonWindow.show();
buttonWindow.resize(200, 100);
return a.exec();
}
在parentchildwidget.cpp中,包含QPushButton,在构造函数中添加如下代码
#include <QPushButton>
#include "parentchildwidget.h"
#include "ui_parentchildwidget.h"
ParentChildWidget::ParentChildWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::ParentChildWidget)
{
ui->setupUi(this);
QPushButton* buttonChild = new QPushButton(this);
buttonChild->setText("我是控件");
}
ParentChildWidget::~ParentChildWidget()
{
delete ui;
}
运行程序,注意文件以utf-8编码保存,否则显示乱码。
结果会看到有两个窗口同时运行,一个button成为顶层窗口,另一个button因为设置了父窗口,所以成为控件,同时标题栏被隐藏。
2.1.3 父子窗口特性
现在修改main函数
#include "parentchildwidget.h"
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ParentChildWidget w;
w.show();
return a.exec();
}
修改parentchildwidget.cpp构造函数
ParentChildWidget::ParentChildWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::ParentChildWidget)
{
ui->setupUi(this);
for (int i = 1; i <= 3; ++i)
{
QPushButton* buttonChild = new QPushButton(this);
buttonChild->setText(QString("我是控件%1").arg(i));
buttonChild->resize(100*i, 100);
connect(buttonChild, SIGNAL(clicked()), buttonChild, SLOT(close()));
}
}
运行程序
我们看到窗口中只有一个按钮(我是控件3),点击按钮,出现我是控件2,再点击出现我是控件1,并且所有的按钮都在窗口的左上角。
其实,控件1和控件2都被控件3遮盖住了。从这个例子中,可以得出以下结论:
1.子窗口的坐标系是以父窗口的坐标系为基准的,并且默认情况下定位在父窗口的(0,0)点处,窗口的(0,0)点都是在窗口绘图区域的左上角。水平方向向右为正,垂直方向向下为正。可以调用move()函数让控件重新定位,如果传递给它负值,其左上角会移出父窗口的可见区域,则该控件也只绘制可见部分的区域。
2.后创建的控件会覆盖在先创建的控件上。
好了,今天就到这里,我们下期再见。
猜你喜欢
- 2024-11-12 pyqtgraph系列文章:直方图(Histogram)
- 2024-11-12 Window对象的常见事件 window对象常用的方法有哪些?
- 2024-11-12 JavaScript Window - 浏览器对象模型
- 2024-11-12 Python Qt GUI设计:将UI文件转换Python文件三种妙招(基础篇—2)
- 2024-11-12 前端移动端常见问题 前端移动端适配方案
- 2024-11-12 WindowsServer2022:如何扩展磁盘空间?
- 2024-11-12 第36节 window对象的窗口-JavaScript
- 2024-11-12 JavaScript Screen对象 screen对象包含的属性可以修改
- 2024-11-12 「Pygame经典合集」??????终极白嫖大招:让你玩儿到爽
- 2024-11-12 Qt 教程| QScatterSeries 散点图 qt三维散点图
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-