【Qt学习笔记】2.窗体Widget 屏幕坐标 布局

时间:2021-10-21 03:22:00

在Qt中,把窗体(口)叫做Widget。

Widget可以是主窗体(口),也可以是依附在主窗体(口)上的各种控件,作为子窗体,这两种窗口,分别称作*窗口(top-level widget)和子窗口(sub widget)。


*窗口:一个标准的窗口,带边框、标题栏、若干按钮。(独立)

子窗口:在窗口里面的窗口,例如:按钮、文本框等控件。(不独立,随着父窗口移动)


注意:

1、每个子窗口都有一个父窗口

2、子窗口里面可能包含了若干子窗口,是一层一层的关系。

3、*窗口也有父窗口:就是桌面(Desktop Widget),桌面本身也是一个窗口



二、屏幕坐标

描述一个窗口,有两个性质:

1、位置:窗口左上角的坐标x ,y

2、大小:宽度width,高度height(单位:像素)

比如说,我的显示屏分辨率为(1600 * 900),那么左上角(top-left corner)的坐标是(0,, 0),右下角(bottom-right corner)的坐标是(1599,899) 此外要注意,这里说的“左上角”“右下角”是窗口的有效区域。不包括上面的标题栏。


三、子窗口的相对坐标

一个子窗口在父窗口中的位置。


四、定义一个窗口

目标:实现一个窗口界面,向其中添加一个按钮控件。


方法:

1、派生QWidget

2、创建QButton对象,添加到父窗口

3、设置按钮的大小与位置


步骤:

1、写一个主窗口:这是一个继承自QWidget的类(可以手写,但在VS下,直接在解决方案管理器中右键,添加Qt类,更为便捷)

MyWin.h:

#pragma once #include <QWidget> #include <QPushButton> class MyWin : public QWidget { Q_OBJECT public: MyWin(QWidget *parent); //构造函数,参数表示当前窗口的父窗口,若为NULL则表示主窗口 ~MyWin(); };

MyWin.cpp

#include "MyWin.h" MyWin::MyWin(QWidget *parent) : QWidget(parent) { } MyWin::~MyWin() { }


2、写一个按键

MyWin类完善如下:

#pragma once #include <QWidget> #include <QPushButton> class MyWin : public QWidget { Q_OBJECT public: MyWin(QWidget *parent); ~MyWin(); private: QPushButton* my_button; };

MyWin.cpp

#include "MyWin.h" MyWin::MyWin(QWidget *parent) : QWidget(parent) { my_button = new QPushButton(this); //这个button窗口父窗口是this指向的对象,也就是它本身 my_button->setText("change world"); my_button->setGeometry(100, 100, 200, 50); } MyWin::~MyWin()   { //这里delete了一下,但实际上子窗口控件由父窗口管理,因此不必显示delete if (my_button != NULL) { delete my_button; } }

main.cpp

#include "Test2_3a_11_25.h" #include <QtWidgets/QApplication> #include "MyWin.h" int main(int argc, char *argv[]) {     QApplication a(argc, argv); MyWin BaseWindow(NULL); MyWin DerivedWindow(&BaseWindow); BaseWindow.show();     return a.exec(); }


添加子控件时注意:

1、创建子对象时,必须指定父窗口(作为构造函数的参数)

2、析构函数:子窗口控件由父窗口管理,因此不必显示delete


五、更多的控件

QLineEdit:单行文本框

QPlainTextEdit:普通多行文本框

更新了更多的子窗口,现在的代码如下:

【Qt学习笔记】2.窗体Widget 屏幕坐标 布局

【Qt学习笔记】2.窗体Widget 屏幕坐标 布局

【Qt学习笔记】2.窗体Widget 屏幕坐标 布局

执行:

【Qt学习笔记】2.窗体Widget 屏幕坐标 布局


现在有几个很不雅观的问题:

1、布局太难

2、父窗口大小调整时,子窗口如何随着移动?

3、子窗口如何占满控件?

这些问题,接下来会解决。



尾巴:

我发现Qt内部的成员对象的命名采用的是大驼峰法,因此在定义自己的对象时,尽量换一种命名风格以避免跟库中的对象发生命名冲突

【Qt学习笔记】2.窗体Widget && 屏幕坐标 && 布局