Qt使用 std::thread 线程插入数据到 QTableWidget
Qt使用 std::thread 线程插入数据到 QTableWidget中
- 一、实现效果
- 二、主要代码
- 1. ThreadTable.h 头文件
- 2. ThreadTable.cpp 源文件
- 3. 主函数
- 三、注意要点
导言:记录一下Qt使用 std::thread 线程插入数据到 QTableWidget中
QThread 使用的时候有时候不太方便,所有使用c++标准库里面的thread。
我的需求就是使用一个线程去更新 QTableWidget 里面的数据。因为我的界面主线程总是比这个子线程晚结束。我就采用的 detach ,把这个更新数据的线程分离出去。在整个应用使用的是不安全的单例来作为线程执行函数。
在线程中通过发射 updateProductInfo 信号,让GUI主界面线程去响应这个信号去更新表格的内容。
一、实现效果
Qt使用thread线程插入数据到QTableWidget
二、主要代码
1. ThreadTable.h 头文件
#ifndef THREADTABLE_H
#define THREADTABLE_H#include <QWidget>
#include <thread>
#include <QObject>namespace Ui {
class ThreadTable;
}class ThreadTable : public QWidget
{Q_OBJECTpublic://单例static ThreadTable * GetInstance();private:Ui::ThreadTable *ui;QList<QList<QString>> productTable;explicit ThreadTable(QWidget *parent = nullptr);~ThreadTable();static ThreadTable * Instance;//更新表格的函数static void upDateTable();
Q_SIGNALS://更新数据的信号void updateProductInfo(int row, int column, QString data);private Q_SLOTS://UI界面响应插入信号void SlotUpdateProductInfo(int row, int column, QString data);//启动线程按钮void on_pushButton_clicked();
};#endif // THREADTABLE_H
2. ThreadTable.cpp 源文件
#include "ThreadTable.h"
#include "ui_ThreadTable.h"
ThreadTable* ThreadTable::Instance = nullptr;
ThreadTable::ThreadTable(QWidget *parent) :QWidget(parent),ui(new Ui::ThreadTable)
{ui->setupUi(this);//表格的一些更新ui->productTB->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);ui->productTB->setRowCount(20);ui->productTB->setColumnCount(5);//关联槽函数connect(this, &ThreadTable::updateProductInfo, this, &ThreadTable::SlotUpdateProductInfo);//初始化数据productTable = {{"1", "牙刷","2022-11-13", "2023-1-3", "成都智康科技有限公司"},{"2", "牙膏","2022-3-5", "2023-1-3", "成都科技有限公司"},{"3", "牛皮","2022-4-7", "2023-1-3", "成都康科技有限公司"},{"4", "纸币","2022-5-13", "2023-1-3", "成都智科技有限公司"},{"5", "皮鞋","2022-11-13", "2023-1-3", "成都智康科技有限公司"},{"6", "核酸","2022-3-5", "2023-1-3", "成都科技有限公司"},{"7", "漱口水","2022-4-7", "2023-1-3", "成都康科技有限公司"},{"8", "可乐","2022-5-13", "2023-1-3", "成都智科技有限公司"},{"9", "牙刷","2022-11-13", "2023-1-3", "成都智康科技有限公司"},{"10", "牙膏","2022-3-5", "2023-1-3", "成都科技有限公司"},{"11", "牛皮","2022-4-7", "2023-1-3", "成都康科技有限公司"},{"12", "纸币","2022-5-13", "2023-1-3", "成都智科技有限公司"},{"13", "皮鞋","2022-11-13", "2023-1-3", "成都智康科技有限公司"},{"14", "核酸","2022-3-5", "2023-1-3", "成都科技有限公司"},{"15", "漱口水","2022-4-7", "2023-1-3", "成都康科技有限公司"},{"16", "可乐","2022-5-13", "2023-1-3", "成都智科技有限公司"}};}ThreadTable::~ThreadTable()
{delete ui;
}ThreadTable *ThreadTable::GetInstance()
{if(Instance == nullptr){Instance = new ThreadTable;}return Instance;
}void ThreadTable::upDateTable()
{for (int i = 0; i < ThreadTable::GetInstance()->productTable.length(); i++){for (int j = 0; j < 5; j++){emit ThreadTable::GetInstance()->updateProductInfo(i, j, ThreadTable::GetInstance()->productTable[i][j]);}//一行就延时 1s_sleep(1000);}
}void ThreadTable::SlotUpdateProductInfo(int row, int column, QString data)
{ui->productTB->setItem(row, column, new QTableWidgetItem(data));
}void ThreadTable::on_pushButton_clicked()
{std::thread m_thread(&ThreadTable::GetInstance()->upDateTable);//线程要分离,不然会卡顿m_thread.detach();
}
3. 主函数
#include <QApplication>
#include <ThreadTable.h>int main(int argc, char *argv[])
{QApplication a(argc, argv);//不要直接用构造函数,不然会有多个实例在内容里面,有时候就设置不对劲了ThreadTable * w = ThreadTable::GetInstance();w->show();return a.exec();
}
三、注意要点
- 因为我们不能在线程去设置主线程的一些ui,我们必须通过在 线程里面去发送更新数据的信号,用信号去传数据, 用信号槽去更新界面
//线程执行函数
void ThreadTable::upDateTable()
{for (int i = 0; i < ThreadTable::GetInstance()->productTable.length(); i++){for (int j = 0; j < 5; j++){emit ThreadTable::GetInstance()->updateProductInfo(i, j, ThreadTable::GetInstance()->productTable[i][j]);}//一行就延时 1s_sleep(1000);}
}
- 有时候我们传递的信号 用了一些特殊的数据结构或者类,我们必须在线程启动前,在Qt里面注册这个数据类型
//注册的一些例子
qRegisterMetaType<QTextBlock>("QTextBlock");
qRegisterMetaType<QTextDocument*>("QTextDocument*");
qRegisterMetaType<QList<QList<double>>>("QList<QList<double>>");//按钮启动去更新页面
void ThreadTable::on_pushButton_clicked()
{//在这里加都可以的,在构造函数加最好啦//qRegisterMetaType<数据类型>("数据类型"); 这个尖括号和圆括号里面的字符串要一致哈,不然会出问题std::thread m_thread(&ThreadTable::GetInstance()->upDateTable);//线程要分离,不然会卡顿m_thread.detach();
}
Qt使用 std::thread 线程插入数据到 QTableWidget相关推荐
- 使用std::thread线程相关函数,-static静态编译的程序运行时的一些常见错误
使用std::thread的应用程序,编译时如果是动态链接pthread线程库运行正常,-static静态链接时在某些平台下可能会遇到一些意外错误.如常见编译命令:g++ -std=C++11 tes ...
- C++多线程编程实战01:std::thread
C++多线程:std::thread 文章目录 C++多线程:std::thread 定义 构造函数 析构函数 赋值操作函数 join与datch 例子 例子 其它 基本用法 线程参数 等待线程完成( ...
- std::thread与pthread
线程std::thread与pthread对比 多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,两种类型的多任务处理:基于进程和基于线程. 基于进程的多 ...
- C++多线程:std::thread
最近这段时间在学习C++多线程相关的知识,打算将学习的内容记录下来,加深理解和记忆. C++11 新标准中引入了五个头文件来支持多线程编程,他们分别是<atomic> ,<threa ...
- std::thread使用
c++ 11 之后有了标准的线程库:std::thread.通过c++11中的线程库创建线程,极为方便,且跨平台,是语言层面的.之前跨平台的多线程开发中,多使用boost 相关第三方库. 1.std: ...
- 关于std::thread以及std::condition_variable的一些细节备忘
也算是看过不少多线程相关的资料了,但是一直对于其中的一些细节没有太好的把握,比如std::thread线程真正开始运行的时机,比如join.detch等真正的作用. 跟着<Cplusplus C ...
- C++11 并发指南------std::thread 详解
参考: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Int ...
- Spring Boot 配置线程池使用多线程插入数据
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~个人原创+1博客:点击前往,查看更多 来源:h ...
- 19.Qt中Thread线程中创建QTcpSocket
Thread线程中创建QTcpSocket 本文承接上一篇博文,Qt线程创建,本文记录在线程中创建socket 套接字,连接服务器进行编程. /**************************** ...
最新文章
- Windows Server 2008 R2 配置笔记,密码设置为任意长度,远程桌面终端连接数的设置...
- java去除不为null,JAVA代码中去掉 “!=null”
- 11寸笔记本电脑推荐_3000-20000元高性价比笔记本电脑推荐 含CPU天梯图、显卡天梯图 2020年11月更新...
- linux下搜狗安装目录,Linux安装搜狗输入法
- 视频技术系列 - 2020年超高清视频技术创新实践
- 【Java从0到架构师】RocketMQ 使用 - 发送消息、接收消息、特殊消息
- 拓端tecdat|Python使用神经网络进行简单文本分类
- 17计算机病毒,计算机病毒的病毒的分类川大《计算机文化基础0008》17秋在
- VBScript编程教程 [下]
- vep加密视频破解转换翻录为mp4教程
- 《设计模式之禅》-原型模式
- 推流式搅拌器选型功率计算方法_潜水搅拌机如何计算功率
- K-means聚类以及利用K-means来压缩图像
- 商务智能 BI 的四大关键技术
- 赛扬处理器_两款还未官宣的10代赛扬出现在海外电商平台,赛扬首次拥有4MB三级缓存...
- 在web代理中对于大的POST数据使用 REQUEST_CONTENT
- 李想又要赴美上市了,高中辍学的他凭什么?
- Dump 文件的生产,作用,查看和调试
- 零基础小白自学编程选哪种语言好?告诉你世上最好编程语言推荐
- 具有软件特色的电子小硕求职记
热门文章
- fduthesis使用问题: Overleaf 生僻字处理——整体和局部修改字体(个别中文字符显示问题)
- 分析一波,中国月收入过万的人真的很多吗?
- 客服助手,两大客服常用工具,值得收藏!
- java使用百度人脸识别API
- lisp将图元追加选择_晓东CAD家园-论坛-A/VLISP-向块添加新图元,添加图元到块内 - Powered by Discuz!...
- 计算机基础知识大学分班,大学计算机基础课分层教学研究
- 第6-2课:决策树、博弈树和行为树
- 华为笔记本linux系统怎么装win10,华为笔记本电脑一键重装win10系统详细步骤
- MySQL的 SSL 连接配置
- WordPress自定义文件上传路径的方法