一、初识Qt
1.创建一个Qt项目
2.Qt类的主要继承关系
3.Qt工程的各个文件
头文件xxx.h:主要用于函数和类的声明,使用预处理指令防止头文件被重复包含,导致出错。头文件中的Q_OBJECT宏是使用Signal和Slot必要添加的。、
构造函数中传递的指针是父对象指针,使用父对象指针可以使得子对象在父对象上显示,当父对象被删除时,会自动删除子对象。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
xxx.cpp文件,cpp文件中主要是用于定于类中声明的函数,需使用初始化列表初始化父类对象,可以在构造函数中设计各个模块,将其添加在父对象中。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
main.cpp。程序运行的入口,这里的主函数由argc和argv两个参数,有一个主程序QApplication实例后的对象a,main函数将函数的控制权转移给a,函数a.exec()循环等待Qt事件的发生保证Qt程序一直能够运行。
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
二、使用Qt创建一个简单的界面
Qt初体验,使用Qt创建一个含有两个按钮的界面,一个按钮当按下的时候退出程序,令一个按钮在按下的时候会输出“hello”。
第三个connect函数使用的标准的signal-slot模式,connect函数使用两个对象指针和两个函数指针完成消息的传递和事件的处理。
第一个connect函数使用signal-slot模式,slot使用的是lambda匿名函数,[]可以选择函数形参传递是值传递还是引用传递,()表示形参列表,{}表示函数体。
第二个connect函数使用的是signal-siganl模式,当按钮按下的时候唤醒hungury函数,紧接着hungury函数唤醒匿名表达式执行打印任务。
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
ui->setupUi(this);
QPushButton *btn = new QPushButton("按钮", this);
btn->move(200, 200);
teacher = new Teacher(this);
student = new Student(this);
connect(teacher, &Teacher::hungury, student, []() { qDebug() << "hello" << endl; });
// this->ClassIsOver(teacher);
QPushButton *btn2 = new QPushButton("hungury", this);
connect(btn2, &QPushButton::clicked, teacher, &Teacher::hungury);
connect(btn, &QPushButton::clicked, this, &Widget::close);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
qDebug() << "hello" << endl;
this->close();
}
Teacher::Teacher(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
}
Teacher::~Teacher()
{
delete ui;
}
Student::~Student()
{
delete ui;
}
Student::Student(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
}
void Student::treat()
{
qDebug() << "student treat" << endl;
}
三、signal-slot机制初探
signal-slot机制主要用于事件的响应,例如当鼠标按下按钮执行相应地操作,可将按钮按下当作信号,相应的操作当作slot,本质上是两个对象的函数的绑定联动。
Qt5常规用法:
connect(sender,&QPushButton::clicked, receiver, &Widget::close)
使用connect函数进行绑定,sender和receiver是两个对象指针,&clicked和&close是两个函数指针。
自定义signal和slot。
上述的clicked和close都是在Qt内置的信号的槽,由于信号和槽的本质是函数,因此注意传递函数指针以及信号的发送就可以完成信号的传递和事件的响应。
1.先创建Student类和Teacher类Student类中定义槽函数treat,Teacher类中定义信号函数hunguray;
2.在主窗口widget类中定义信号发射函数ClassIsOver(),使用Qt内置的信号发射函数emit()发射信号。
class Student : public QWidget
{
Q_OBJECT
public:
Student(QWidget *parent = nullptr);
~Student();
public slots:
void treat();
private:
Ui::Widget *ui;
};
class Teacher : public QWidget
{
Q_OBJECT
public:
Teacher(QWidget *parent = nullptr);
~Teacher();
signals:
void hungury();
private:
Ui::Widget *ui;
};
class Widget : public QWidget
{
Q_OBJECT
public:
Teacher *teacher = nullptr;
Student *student = nullptr;
public:
Widget(QWidget *parent = nullptr);
~Widget();
void Widget::ClassIsOver(Teacher *teacher)
{
//发送信号
emit teacher->hungury();
}
}
四、