0
点赞
收藏
分享

微信扫一扫

基于YOLOv8深度学习的智能车牌检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

其生 2024-11-06 阅读 10

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 还提供了线程安全的数据结构和机制,例如 QMutexQWaitCondition

QThread

  • QThread 类用于创建和管理线程。开发者可以通过继承 QThread 类来重写 run() 方法,从而定义线程的执行逻辑。

  • 使用 QThread 可以将长时间运行的任务放入新的线程中,从而不会阻塞主线程(通常是GUI线程)。

信号与槽

  • Qt 的信号与槽机制使得线程之间的通信变得简单。通过信号与槽,您可以在一个线程中发出信号,而在另一个线程中连接槽函数来处理这些信号。

  • 在跨线程使用信号与槽时,Qt 会自动处理事件队列,保证线程安全。

QMutex

  • QMutex 类是一个互斥量,用于保护共享资源的访问。通过在访问共享数据之前调用 lock(),在完成后调用 unlock(),开发者可以避免多个线程同时访问同一资源引发的数据不一致问题。

QWaitCondition

  • QWaitCondition 用于在线程之间进行通知和等待。它允许一个线程在需要等待某个条件发生时进入等待状态,并且可以通过另一个线程发出信号来唤醒等待的线程。

四、数据结构 

  • QVariant

    • 用于存储和转换不同数据类型的通用容器。
  • QString

    • 表示字符串,具有强大的文本处理功能。
  • QByteArray

    • 用于处理字节数组的数据类型。
  • QList/QVector/QMap

    • Qt提供的容器类,类似于标准库中的容器。
举报

相关推荐

0 条评论