1. 父窗口
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ffbf6ad0762f226cdb902cbef8e6340f.png)
- 一般界面简单用 QDialog
- 界面复杂用 QMainWindow
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6a8304e09ddb6d94aee953ea15e3b049.png)
- 设置位置的 x, y, 对于父窗口是相对于屏幕的,对于父窗口里的控件是相对于父窗口的。
- 设置大小时,如果父窗口里的控件大小超出父窗口的话,超出部分是不能正常显示的。
- 通过new操作符创建窗口对象时,指定其停靠的父窗口,这样的对象可以不显示的去写delete操作。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e78edc0a6277ed14121e088650f93109.png)
#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QDialog>
int main(int argc, char** argv){
QApplication app(argc, argv);
QDialog parent;
parent.move(50, 50);
parent.resize(320, 240);
QLabel label("标签", &parent);
label.move(20, 40);
QPushButton button("按钮", &parent);
button.move(20, 100 );
button.resize(80, 80);
QPushButton* p_button = new QPushButton("按钮", &parent);
p_button->move(170, 100);
p_button->resize(80, 80);
parent.show();
return app.exec();
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/551c7e4333ecce97e1c999ebe33c1879.png)
2. 信号和槽
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5ef998faf92dceef04bee35d1e460fed.png)
2.1 信号的定义
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f78e6ab914a983e1e2655b43608b6f56.png)
- Qt是C++ 实现的,而且在C++语法之上,还有一些扩展的语法。在信号和槽这部分就可以体现出来。
- signal是信号的标记,有了这个标记以后,就不再符合标准C++的语法了。
- Q_OBJECT 是一个宏, 对应着 Qt 里面的链接工具 moc(源对象编译器,专门处理语法扩展)
- 构建工程时,如果发现类中有 Q_OBJECT 这个标记,会把信号和槽的语法扩展还原成标准的C++代码,然后再用C++的标准编译器来编译和链接。
- 信号函数 signal_func(…)可以直接作为语句执行(发射信号),或者前面加emit,emit signal_func(…)。自定义信号函数平时用的很少,因为Qt原生类的信号函数,可以满足绝大多数的开发场景。
2.2 槽的定义
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/bd314c4ced764f58c229520066f81703.png)
- slots 是一个槽的标记,有了这个标记以后,就不再符合标准C++的语法了。moc会把带有语法扩展的槽,还原成C++代码。然后再通过C++编译器完成最终的编译和链接。
2.3 信号和槽的连接
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7d34a98112ab0890f363e825dad3fa90.png)
- 信号和槽的连接是利用顶层类QObject的一个静态成员函数connect来完成的
- sender可以接收QObject类类型的指针,或者QObject类子类类型的指针(向上造型)
- signal指定具体使用的哪个信号, 即要发送的信号函数, 类型是const char* 。但一般通过控件提供的信号函数名是函数指针类型的,宏SIGNAL 可以把函数指针类型的函数名转为 const char* 类型
- 同理,宏SLOT 可以把一个函数指针类型的槽函数名转为const char* 类型
#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QDialog>
int main(int argc, char** argv){
QApplication app(argc, argv);
QDialog parent;
QLabel label("label", &parent);
label.move(50, 50);
QPushButton button("button", &parent);
button.move(50, 100);
QPushButton button2("exit", &parent);
button2.move(150, 100);
QObject::connect(&button, SIGNAL(clicked()), &label, SLOT(close()));
QObject::connect(&button2, SIGNAL(clicked()), &app, SLOT(quit()));
parent.show();
return app.exec();
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/bc7ec3aa9e75a771ca58248666602bb4.png)
2.4 语法要求
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9ef87be74c3fc2590d2b846093c6767f.png)
- 可以这样理解,信号函数的参数值会被传给槽函数,最终触发槽函数的执行。
2.5 应用
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a0c64e2466588747cbfbfdbfdfbb7bc0.png)
- 一对多时,连接顺序是不确定的。
- 信号级联:当A1发射信号以后,它所连接的A2的信号也将被发送。
-
- 应用场景:通过一个对象的信号去触发另一个对象的执行,但这两个对象不在同一个作用域,不能通过connect直接连接。这时可以通过一个中间对象的信号作为消息的级联。
2.6 案例
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/92b7528d96b9ddfc2e821fa8ca7d9e4a.png)
#include <QApplication>
#include <QDialog>
#include <QSpinBox>
#include <QSlider>
int main(int argc, char** argv){
QApplication app(argc, argv);
QDialog parent;
QSlider slider(Qt::Horizontal, &parent);
slider.move(50, 50);
slider.setRange(1, 20);
QSpinBox box(&parent);
box.move(200, 50);
box.setRange(1, 20);
QObject::connect(&slider, SIGNAL(valueChanged(int)), &box, SLOT(setValue(int)));
QObject::connect(&box, SIGNAL(valueChanged(int)),&slider, SLOT(setValue(int)));
parent.show();
return app.exec();
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6dd29df1a8b6f5cd1fa51b9633b39538.png)