QT模块--Core
Qt 是一个强大的跨平台应用程序开发框架,其中 Qt Core 模块是所有 Qt 应用程序的基础。
他包含了一些比较核心的基础功能:包括事件循环、信号与槽机制、线程管理、时间处理和数据结构。
一、事件循环
1.事件循环:从事件队列中提取事件,将事件分发给相应的事件处理函数。
2.事件源:事件源是生成事件的对象,比如:用户接口元素(比如按钮、文本框等)、定时器、网络连接。
3.启动事件循环:在我们创建一个新项目的时候,以我们生成的main.cpp文件为例。
#include <QCoreApplication>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
// 其他初始化代码
return a.exec(); // 启动事件循环
}
其中的事件循环启动是使用 QCoreApplication::exec()
方法启动。
4.处理事件:一般包括重载相应的事件处理函数(键盘事件、鼠标事件)和根据需求自定义的事件处理函数。这里以重载的事件函数为例。
void MyWidget::mousePressEvent(QMouseEvent *event) {
// 处理鼠标按下事件
}
void MyWidget::keyPressEvent(QKeyEvent *event) {
// 处理键盘按下事件
}
void MyWidget::timerEvent(QTimerEvent *event) {
// 处理定时器事件
}
5.事件过滤:通过 installEventFilter()
方法,您可以在不同的对象之间过滤事件,例如在一个对象上拦截事件,然后决定是否将其传递给下一个目标。
6.多线程中的事件循环:在 Qt 中,可以为每个线程创建一个事件循环,这样每个线程可以处理它自己的事件。使用 QThread
类可以实现。
二、信号与槽机制
Qt 最具特色的功能之一是信号与槽机制,它是实现对象间通信的主要工具。当对象的状态发生变化时,可以发出信号,其他对象可以通过槽来响应这些信号。
示例
#include <QCoreApplication>
#include <QObject>
#include <QDebug>
class Sender : public QObject {
Q_OBJECT
public:
void sendSignal() {
emit mySignal();
}
signals:
void mySignal();
};
class Receiver : public QObject {
Q_OBJECT
public slots:
void onMySignal() {
qDebug() << "Signal received!";
}
};
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
Sender sender;
Receiver receiver;
QObject::connect(&sender, &Sender::mySignal, &receiver, &Receiver::onMySignal);
sender.sendSignal(); // 发送信号
return app.exec();
}
上面是一种connect函数的使用方法
以下在列举一些其他的使用形式:
方式一:
直接在ui界面添加控件的时候右键转到槽函数可以自动声明槽函数和在cpp文件中定义,这里以pushbutton为例。
void MainWindow::on_pushButton_clicked()
{
std::cout << "sji" << std::endl;
}
方式二:
使用Object::connect做连接Object::connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(style_2()));
在.h.cpp文件中声明定义style_2()函数
void MainWindow::style_2()
{
std::cout << "style_2" << std::endl;
}
方式三:
使用C++11的lambda表达式 Object::connect(sender,&Sender::signal,[=](){*lambda_body*});
可以在同一位置更改信号处理逻辑,提高代码的可读性。使用lambda表达式之间在connect这里直接编写事件处理的函数。
connect(ui->pushButton_3,&QPushButton::clicked,[=](){
std::cout << "style_4" << std::endl;
});
方式四:
使用函数指针 Object::connect(sender,&Sender::signal,receiver,&Receiver::slot); 编译时提供更好的类型检查。
connect(ui->pushButton_4,&QPushButton::clicked,this,&MainWindow::style_3);
同理定义事件处理函数
void MainWindow::style_3()
{
std::cout << "style_3" << std::endl;
}
三、线程管理
Qt Core 模块也提供了对多线程编程的支持,开发者可以使用 QThread
类来创建和管理线程。此外,Qt 还提供了线程安全的数据结构和机制,例如 QMutex
和 QWaitCondition
。
QThread
-
QThread
类用于创建和管理线程。开发者可以通过继承QThread
类来重写run()
方法,从而定义线程的执行逻辑。 -
使用
QThread
可以将长时间运行的任务放入新的线程中,从而不会阻塞主线程(通常是GUI线程)。
信号与槽
-
Qt 的信号与槽机制使得线程之间的通信变得简单。通过信号与槽,您可以在一个线程中发出信号,而在另一个线程中连接槽函数来处理这些信号。
-
在跨线程使用信号与槽时,Qt 会自动处理事件队列,保证线程安全。
QMutex
-
QMutex
类是一个互斥量,用于保护共享资源的访问。通过在访问共享数据之前调用lock()
,在完成后调用unlock()
,开发者可以避免多个线程同时访问同一资源引发的数据不一致问题。
QWaitCondition
-
QWaitCondition
用于在线程之间进行通知和等待。它允许一个线程在需要等待某个条件发生时进入等待状态,并且可以通过另一个线程发出信号来唤醒等待的线程。
四、数据结构
-
QVariant
- 用于存储和转换不同数据类型的通用容器。
-
QString
- 表示字符串,具有强大的文本处理功能。
-
QByteArray
- 用于处理字节数组的数据类型。
-
QList/QVector/QMap
- Qt提供的容器类,类似于标准库中的容器。