一、QT是一款跨平台的c++图形用户界面应用程序框架;
应用程序框架:封装好的各种类库,需要使用某种功能时,可以直接调用相应接口。
二、QT工程的创建
1.New Project ---> Application ---> QT Widgets Application ---> choose ---> 名称(不要包含中文名称) ---> 基类的选择;
基类:QMainWindow: 主要用于PC端,带菜单栏;
QDialog: 对话框(不能伸缩);
QWidget: 窗口控件(可以伸缩);
2、QT头文件特点:
- 头文件没有.h;
- 头文件和类名一样;
均以Q开头,且前两个字母均大写;
3、两个控件之间需要指定父对象才会有联系,否则为两个独立的窗口,无任何联系;
指定父对象有两种方法:
- obj.setParent(&Parent); //指定obj的父类对象,将父类对象取址作为参数传入
- 通过构造函数传参: QPushButton b(&Parent);
指定父对象的好处:只需父对象显示,上面的子对象就会自动显示。
4、信号与槽:QT对象之间通信的接口
connect(&b, &QPushButton::pressed, this, &Widget::close);
四个参数均为指针类型,第一个参数为信号发出者,第二个参数为要发送的信号,第三个参数为信号的接收者,第四个信号为槽函数,对接收到的信号做出相应的处理(可以是库函数,也可以是自己定义的函数)。
两个窗口切换实例:
主控窗口头文件:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
#include "subwidget.h"
class Widget : public QWidget
{
Q_OBJECT //宏声明,信号与槽函数使用所需
private:
QPushButton b1;
subWidget w;
public:
Widget(QWidget *parent = 0);
~Widget();
void changWindow();
void deal();
};
#endif // WIDGET_H
子窗口头文件:
subwidget.h
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class subWidget : public QWidget
{
Q_OBJECT
private:
QPushButton b;
public:
explicit subWidget(QWidget *parent = 0);
void sendslot();
signals:
/* 信号必须由signals关键字声明(自定义信号)
* 信号没有返回值,但可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用:emit MySignal();
*/
void mysignal();
public slots:
};
#endif // SUBWIDGET_H
main.cpp
#include "widget.h"
#include <QApplication> //应用程序类
int main(int argc, char *argv[])
{
QApplication a(argc, argv); //有且只有一个应用程序类的对象
Widget w; //继承于QWidget,QWidget是一个窗口基类,所以Widget也是窗口类
w.show(); //w就是一个窗口,创建的窗口默认隐藏,需要人为显示
return a.exec();
//等价于a.exec(); return 0; 作用:让程序一直执行,等待用户操作,即等待事件的发生
}
主窗口构造函数的实现:
widget.cpp
#include "widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent)
{
resize(400,300); //设置窗体大小
setWindowTitle("main"); //设置窗口名称,若不设置,默认为工程名
b1.setText("切换到子窗口"); //设置按键显示的名称
b1.setParent(this); //指定按键的父类
connect(&b1, &QPushButton::clicked, this, &changWindow);
connect(&w, &subWidget::mysignal, this, &Widget::deal);
//由于子类不含父类的对象,所以只能使用自定义信号建立联系,从子窗口切换回主窗口
Widget::~Widget()
{
}
void Widget::changWindow()
{
hide();
w.show();
}
void Widget::deal()
{
w.hide();
show();
}
子窗口构造函数的实现:
subwedget.cpp
#include "subwidget.h"
subWidget::subWidget(QWidget *parent) : QWidget(parent)
{
resize(400,300);
setWindowTitle("minor");
b.setText("切换到主窗口");
b.setParent(this);
connect(&b, &QPushButton::pressed, this, &sendslot);
}
void subWidget::sendslot()
{
emit mysignal();
}
附:
信号可以带参数,可以重载:如:
void dealsub();
void dealslot(int, QString);
在调用connect函数时,为避免二义性,应定义对应类型的函数指针指向不同的信号,如:
//对于重载的信号,要定义相同类型的函数指针,让指针做connect的参数就可以避免二义性。
void (SubWidget::* signal_1)() = &SubWidget::MySignal;
connect(&w,signal_1, this, &Widget::dealsub);
void (SubWidget::* signal_2)(int, QString) = &SubWidget::MySignal;
connect(&w,signal_2, this, &Widget::dealslot);