Qt框架
main.cpp #include "mywidget.h" //QApplication应用程序类 //Qt头文件没有.h //头文件和类名一样,开头两个字母大写 #include <QApplication> int main(int argc, char *argv[]) { //有且只有一个应用程序类的对象 QApplication a(argc, argv); //MyWidget继承于QWidget,QWidget是一个窗口基类 //所以MyWidget也是窗口类 //w就是一个窗口 MyWidget w; //窗口创建默认是隐藏的,需要人为显示 w.show(); a.exec(); return 0; } mywidget.h #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> class MyWidget : public QWidget { Q_OBJECT//信号与槽的时候需要 public: MyWidget(QWidget *parent = 0); ~MyWidget(); }; #endif // MYWIDGET_H mywidget.cpp #include "mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { } MyWidget::~MyWidget() { } 项目文件 #------------------------------------------------- # # Project created by QtCreator 2017-08-05T11:19:35 # #------------------------------------------------- # 这里是项目文件 #模块 QT += core gui #高于4版本,添加 QT += widgets ,为了兼容Qt4 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #应用程序的名字 TARGET = 01_QtTest #指定makefile的类型,app TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 #源文件 .cpp文件 SOURCES += \ main.cpp \ mywidget.cpp #头文件 .h文件 HEADERS += \ mywidget.h 这就是最基本的Qt框架第一个Qt程序,HelloQt
main.cpp #include<QApplication> #include<QWidget> //窗口控件基类 #include<QPushButton> int main(int argc,char **argv) { QApplication app(argc,argv); QWidget w; w.setWindowTitle("主要看气质"); QPushButton b; b.setText("确定"); //给按钮设置内容 b.setParent(&w); //指定父对象 b.move(100,100); //移动坐标 QPushButton b1(&w); //通过构造函数传参 b1.setText("取消"); b1.move(200,100); w.show(); /*如果不指定父对象,对象和对象(窗口和窗口)没有关系,独立 * a指定b为它的的父对象,a放在b的上面 * 指定父对象,有两种方式: * 1,setParent * 2, 通过构造函数传参 * 指定父对象,只需要父对象显示,上面的子对象自动显示 */ app.exec(); return 0; } 自己写的项目文件 QT += widgets SOURCES += \ main.cpp运行结果: 这里创建的是一个空项目,不是一个应用程序,也就是说代码完全是自己手写的
信号和槽
main.cpp #include "mainwidget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWidget w; //执行MainWidget的构造函数 w.show(); return a.exec(); } mainwidget.h #ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QWidget> #include <QPushButton> #include "subwidget.h" //子窗口 class MainWidget : public QWidget { Q_OBJECT public: MainWidget(QWidget *parent = 0); ~MainWidget(); void myslot(); void changeWin(); void dealSub(); private: QPushButton b1; QPushButton *b2; QPushButton b3; SubWidget w; }; #endif // MAINWIDGET_H subwidget.h #ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QWidget> #include <QPushButton> class SubWidget : public QWidget { Q_OBJECT public: explicit SubWidget(QWidget *parent = nullptr); void sendSlot(); signals: /*信号必须有signals关键字 * 信号没有返回值,但可以有参数 * 信号就是函数的声明,只需声明,无需定义 * 使用:emit mySignal(); */ void mySignal(); public slots: private: QPushButton b; }; #endif // SUBWIDGET_H mainwidget.cpp #include "mainwidget.h" #include <QPushButton> MainWidget::MainWidget(QWidget *parent) : QWidget(parent) { b1.setParent(this); b1.setText("确定"); b1.move(100,100); b2 = new QPushButton(this); b2->setText("取消"); b2->move(200,100); connect(&b1,&QPushButton::pressed,this,&MainWidget::close); /* &b1:信号发出者,指针类型 * &QPushButton::pressed:处理的信号, &发送者的类名::信号名字 * this:信号接受者 * &MainWidget::close:槽函数,信号处理函数 &接收的类名::槽函数名字 */ /* 自定义槽 * Qt5:任意成员函数,普通全局函数,静态函数 * 槽函数需要和信号一致(参数,返回值) * 由于信号都是没有返回值,所以,槽函数一定没有返回值 */ connect(b2,&QPushButton::released,this,&MainWidget::myslot); connect(b2,&QPushButton::released,&b1,&QPushButton::hide); /* 信号:短信 * 槽函数:接收短信的手机 */ setWindowTitle("大Boss"); //this->setWindowTitle("大Boss"); b3.setParent(this); b3.setText("切换到子窗口"); b3.move(300,100); //显示子窗口 //w.show(); connect(&b3,&QPushButton::released,this,&MainWidget::changeWin); //处理子窗口的信号 connect(&w,&SubWidget::mySignal,this,&MainWidget::dealSub); resize(800,800); } void MainWidget::myslot() { b2->setText("真的吗?"); } void MainWidget::changeWin() { //子窗口显示 w.show(); //本窗口隐藏 this->hide(); } void MainWidget::dealSub() { //子窗口隐藏 w.hide(); //主窗口显示 this->show(); } MainWidget::~MainWidget() { } subwidget.h #include "subwidget.h" SubWidget::SubWidget(QWidget *parent) : QWidget(parent) { setWindowTitle("小弟"); b.setParent(this); b.setText("切换到主窗口"); connect(&b,&QPushButton::clicked,this,&SubWidget::sendSlot); resize(800,800); } void SubWidget::sendSlot() { emit mySignal(); }运行结果:
注意:我们把所有操作都放在构造函数中实现,所有部件都声明为类的私有成员,在构造函数中对部件进行实例化和相应的操作。设定父对象有两种方式,一种是setParent,另一种是构造函数传参。如果要实现多个窗口,要将子窗口的头文件包含到付窗口的头文件,在父类中进行声明或者实例化。也可以自定义槽函数。由于父对象中有子对象的声明,则可以直接操作子对象。而在子对象中没有父对象的声明,则子对象必须发送信号给父对象,然后交给父对象执行。