一、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_Hmain.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);