首页 > 其他分享 >QT笔记:多线程和信号槽

QT笔记:多线程和信号槽

时间:2024-01-23 11:45:09浏览次数:29  
标签:set QT Thread 笔记 thread VERSION test 多线程

QT笔记:多线程和信号槽

多线程

创建多线程有两种方法,一般推荐用moveToThread方法

参考代码如下:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QApplication>


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

main.cpp

#include "mainwindow.h"
#include "my_thread.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // MainWindow w;
    // w.show();
    QThread my_thread;
    Worker worker(20);

    QObject::connect(&my_thread,&QThread::started,&worker,&Worker::doWork);

    worker.moveToThread(&my_thread);

    my_thread.start();

    uint32_t main_count=10;
    for(uint32_t i=0; i<main_count;i++ )
    {
        qDebug() << "main runing count:"<<i;
        QThread::msleep(1000);
    }


    my_thread.quit();
    my_thread.wait();


    return a.exec();

}

my_thread.cpp

#include "my_thread.h"


Worker::Worker(uint32_t count)
{
    count_number=count;
}


void Worker::doWork() {

    for(uint32_t i=0; i<count_number;i++ )
    {
        qDebug() << "Thread runing count:"<<i;
        QThread::msleep(1000);
    }
    emit resultReady();

}

CMakerLists.txt

cmake_minimum_required(VERSION 3.5)

project(Thread_test VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(Thread_test
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
        my_thread.h my_thread.cpp
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET Thread_test APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(Thread_test SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(Thread_test
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(Thread_test PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
  set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.Thread_test)
endif()
set_target_properties(Thread_test PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

include(GNUInstallDirs)
install(TARGETS Thread_test
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(Thread_test)
endif()

信号槽

QT通过信号槽机制进行类似中断事件的交互,使用方法类似如下:

槽写法:

QObject::connect(&my_thread,&QThread::started,&worker,&Worker::doWork);

信号写法:

//在类定义里面定义信号
signals:
    void resultReady();

//在实际程序中发射信号
emit resultReady();

标签:set,QT,Thread,笔记,thread,VERSION,test,多线程
From: https://www.cnblogs.com/simpleGao/p/17981981

相关文章

  • CAN基础知识笔记
    CAN总线协议(ControllerAreaNetwork),控制器局域网总线,是德国BOSCH(博世)公司研发的一种串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。CAN通讯是异步通讯,没有时钟信号线来保持信号接收同步,是半双工通信,无法同时发送与接收,在同一时刻,只能有一个节点......
  • [SQLAlchemy] sqlAlchemy学习笔记(2): 在orm中使用select
    SELECT的作用select在sql中的作用是选中特定列并以表的形式返回,是必要的关键字;在sqlalchemy中,select()方法会返回一个Select对象,并根据这个对象引入其他方法,如where(),join(),order_by()等等fromsqlalchemyimportselectstmt=select(User).where(User.name==......
  • Kruskal 重构树学习笔记
    1.定义与构造对于一张无向图,新建\(n\)个树,原图每个点在一个树中,权值是\(0\)。按边权从小到大枚举边,如果这条边两个节点不在一棵树,合并两个节点所在的树。新建一个点,点权为加入边的边权,同时将两棵树的根节点分别设为新建点的左儿子和右儿子,将新建点设为根。实现与Kruskal最......
  • Docker 学习笔记 - 5
    DockerFile解析是什么Dockerfile是用来构建Docker镜像的构建文件,由一系列命令和参数构成的脚本构建三步骤编写Dockerfile文件dockerbuilddockerrun文件什么样???熟悉的Centos为例http://hub.docker.com/_/centosDockerFile构建过程解析Dockerfile内容基础知识1、每条......
  • C++学习笔记
    C++学习笔记(1)预编译、编译、链接预编译(Preprocessing)cppreference中:GPT这么说:C++预编译是指在编译阶段之前对代码进行的一系列预处理操作。预编译的目的是为了将代码中的预处理指令和宏展开,以及进行一些其他的预处理操作。预处理指令包括以井号(#)开头的指令,如#include、#......
  • Inplementation of Binary Search Tree【1月22日学习笔记】
    点击查看代码//InplementationofBinarySearchTree#include<iostream>usingnamespacestd;structbstnode{ intdata; bstnode*left; bstnode*right;};/*bstnode*root=NULL;*//*root=NULL;wrong*//*全局范围内的变量的初始化必须在声......
  • 学习笔记438—《赤兔之死》高考满分文章
    建安二十六年,公元221年,关羽走麦城,兵败遭擒,拒降,为孙权所害。其坐骑赤兔马为孙权赐予马忠。一日,马忠上表:赤兔马绝食数日,不久将亡。孙权大惊,急访江东名士伯喜。此人乃伯乐之后,人言其精通马语。马忠引伯喜回府,至槽间,但见赤兔马伏于地,哀嘶不止。众人不解,惟伯喜知之。伯喜遣散诸人,抚其......
  • 数据库学习笔记(四)—— MySQL 之 事务篇
    MySQL之事务篇事务事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。事务的四大特性(ACID):A原子性:原子性是指包含事务的操作要么全部执行......
  • 数据库学习笔记(三)—— MySQL 之 SELECT(查询)篇
    查询单表查询select分组函数,分组后的字段from表名[where条件][groupby分组的字段][having分组后的筛选][orderby排序列表];排序SELECT字段名FROM表名ORDERBY字段名[ASC|DESC];ASC表示升序,DESC表示降序,而ORDERBY默认值为ASC。多字段排......
  • openGauss学习笔记-204 openGauss 数据库运维-常见故障定位案例-重建索引失败
    openGauss学习笔记-204openGauss数据库运维-常见故障定位案例-重建索引失败204.1重建索引失败204.1.1问题现象当Desc表的索引出现损坏时,无法进行一系列操作,可能的报错信息如下。index\"%s\"containscorruptedpageatblock%u",RelationGetRelationName(rel),BufferG......