当前位置: 首页 > article >正文

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

QThread

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

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

信号与槽

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

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

QMutex

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

QWaitCondition

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

四、数据结构 

  • QVariant

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

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

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

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

http://www.kler.cn/news/366726.html

相关文章:

  • python编程语法(二)
  • 重构案例:将纯HTML/JS项目迁移到Webpack
  • Python 从入门到实战39(线程间的通信)
  • 51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25
  • 【WebGis开发 - Cesium】三维可视化项目教程---图层管理拓展图层顺序调整功能
  • 隨筆 20241025 Kafka数据一致性的韭菜比喻
  • Oracle数据库语法的使用
  • envoyFilter导致的webSockets协议无法正常工作
  • Docker Redis集群3主3从模式
  • 网关三问:为什么微服务需要网关?什么是微服务网关?网关怎么选型?
  • 4款免费音频剪辑软件带你开启声音创作之旅
  • 基于SpringBoot的时装购物系统【源码】+【论文】
  • BRIA-RMBG-1.4容器构建指南
  • 2024年最新苹果iOS证书申请创建App详细图文流程
  • Jmeter用户定义变量
  • 2024系统架构师---真题考试知识点
  • 【计算机网络 - 基础问题】每日 3 题(五十八)
  • 数据结构(8.4_1)——简单选择排序
  • YOLOv11算法解析
  • WPF+MVVM案例实战(三)- 动态数字卡片效果实现
  • 已解决 django.db.utils.OperationalError: (1051, “Unknown table
  • Vue3 学习笔记(七)Vue3 语法-计算属性 computed详解
  • 基于SpringBoot的宠物爱好者交流系统的设计与实现(源码+定制+开发)
  • 厉兵秣马之Java 语言基础和进阶(二)
  • leetcode动态规划(十七)-组合总和IV
  • Python小游戏9——天天酷跑