Qt文档阅读笔记-Queued Custom Type Example

news2024/12/25 3:52:35

此篇展示了使用Qt编写多线程程序。

概述

此案例创建一Block类,用于存储数据,并且在元对象系统中注册后,在多线程中进行信号与槽函数的连接中充当参数。

Block类

在元对象系统中,注册类,需要类在public部分提供默认构造函数、拷贝构造函数、析构函数。如下所示:

 class Block
 {
 public:
     Block();
     Block(const Block &other);
     ~Block();

     Block(const QRect &rect, const QColor &color);

     QColor color() const;
     QRect rect() const;

 private:
     QRect m_rect;
     QColor m_color;
 };

 Q_DECLARE_METATYPE(Block);

qRegisterMetaType()将类注册到元对象系统前,需要使用Q_DECLARE_METATYPE声明下新类型。

Window类

Window类的public槽函数用于接收Block对象的信号。功能包含了构造界面及图像相关处理。

 class Window : public QWidget
 {
     Q_OBJECT

 public:
     Window();
     void loadImage(const QImage &image);

 public slots:
     void addBlock(const Block &block);

 private slots:
     void loadImage();
     void resetUi();

 private:
     QLabel *label;
     QPixmap pixmap;
     QPushButton *loadButton;
     QPushButton *resetButton;
     QString path;
     RenderThread *thread;
 };

Window类中包含了RenderThread对象,这个是工作线程,RenderThread将发射信号,参数是Block对象,在Window类中使用addBlock(Block)槽进行接收。

在Window类的构造函数中渲染了图像,设置用户界面(2个按钮+1个label)并且进行了信号与槽的连接。

 Window::Window()
 {
     thread = new RenderThread();
     label = new QLabel();
     label->setAlignment(Qt::AlignCenter);

     loadButton = new QPushButton(tr("&Load image..."));
     resetButton = new QPushButton(tr("&Stop"));
     resetButton->setEnabled(false);

     connect(loadButton, SIGNAL(clicked()), this, SLOT(loadImage()));
     connect(resetButton, SIGNAL(clicked()), thread, SLOT(stopProcess()));
     connect(thread, SIGNAL(finished()), this, SLOT(resetUi()));
     connect(thread, SIGNAL(sendBlock(Block)), this, SLOT(addBlock(Block)));

上面最后2行代码是RenderThread对象发出的信号,其中sendBlock是本例的关键。

     ...
     setWindowTitle(tr("Queued Custom Type"));
 }

上面是界面标题设置。

addBlock(Block)槽函数如下:

 void Window::addBlock(const Block &block)
 {
     QColor color = block.color();
     color.setAlpha(64);

     QPainter painter;
     painter.begin(&pixmap);
     painter.fillRect(block.rect(), color);
     painter.end();
     label->setPixmap(pixmap);
 }

当信号发过来,会调用到此槽函数,随后使用paint在label上画图。

RenderThread类

RenderThread类用于处理图像,创建Block对象并发送sendBlock(Block)信号。

 class RenderThread : public QThread
 {
     Q_OBJECT

 public:
     RenderThread(QObject *parent = 0);
     ~RenderThread();

     void processImage(const QImage &image);

 signals:
     void sendBlock(const Block &block);

 public slots:
     void stopProcess();

 protected:
     void run();

 private:
     bool m_abort;
     QImage m_image;
     QMutex mutex;
 };

首先调用processImage()函数,随后这个函数调用start()方法,调用start()后,会回调到从QThread中继承的run()方法:

 void RenderThread::processImage(const QImage &image)
 {
     if (image.isNull())
         return;

     m_image = image;
     m_abort = false;
     start();
 }

 void RenderThread::run()
 {
     int size = qMax(m_image.width()/20, m_image.height()/20);
     for (int s = size; s > 0; --s) {
         for (int c = 0; c < 400; ++c) {

如何处理图片的,在此案例中不用太多考虑,看此函数最后,发出了sendBlock()信号了。

     ...
             Block block(QRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1),
                         QColor(red/n, green/n, blue/n));
             emit sendBlock(block);
             if (m_abort)
                 return;
             msleep(10);
         }
     }
 }

在多线程中每一个sendBlock()信号,都会被放到一个队列中,然后依次调用Window类的addBlock(Block)槽函数。

类型注册

在main()函数中使用qRegisterMetaType()函数对Block类进行注册

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     qRegisterMetaType<Block>();

     Window window;
     window.show();

     window.loadImage(createImage(256, 256));
     return app.exec();
 }

此类注册完成后,才能在信号与槽中,作为参数使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1905908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

56、最近邻向量量化(LVQ) 网络训练对输入向量进行分类

1、LVQ 网络训练对输入向量进行分类简介 1&#xff09;简介 LVQ&#xff08;最近邻向量量化&#xff09;是一种简单而有效的神经网络模型&#xff0c;用于对输入向量进行分类。LVQ网络通过学习一组原型向量&#xff08;也称为代码矢量或参考向量&#xff09;&#xff0c;来表…

如何恢复已删除的音频文件

设备中文件被意外删除并不是什么新鲜事。但是&#xff0c;如果文件是你最喜欢的 MP3 歌曲&#xff0c;那就太令人沮丧了。但你知道吗&#xff0c;有一种方法可以从 Windows 机器中恢复已删除的音乐文件。尝试奇客数据恢复并检索已删除的音频文件。虽然产品名称听起来不像可以帮…

HTML5使用<blockquote>标签:段落缩进

使用<blockquote>标签可以实现页面文字的段落缩进。这一标签也是每使用一次&#xff0c;段落就缩进一次&#xff0c;并且可以嵌套使用&#xff0c;以达到不同的缩进效果。语法如下&#xff1a; <blockquote>文字</blockquote> 【实例】使用<blockquote&…

DC/AC电源模块的节能特点与环保优势

BOSHIDA DC/AC电源模块的节能特点与环保优势 在过去的几十年里&#xff0c;人们对电力的需求不断增加&#xff0c;这导致了电力系统的扩展和增加&#xff0c;为了满足这些需求&#xff0c;传统的交流&#xff08;AC&#xff09;电源系统在全球范围内广泛使用。然而&#xff0c…

8.1 栅格图层符号化整体说明

文章目录 前言栅格图层符号化总结 前言 地图制图是QGIS的优势所在&#xff0c;QGIS包含完整的地图制图功能&#xff0c;如标注与注记、符号化与地图综合等多种功能。 在地图制图过程中&#xff0c;必须经过符号化和地图综合两个最基本的操作。符号化&#xff08;Symbolization&…

《Nature》文章:ChatGPT帮助我学术写作的三种方式

图片翻译 ** 文章内容** 忏悔时间&#xff1a;我使用生成式人工智能&#xff08;AI&#xff09;。尽管在学术界关于聊天机器人是积极力量还是消极力量的争论不休&#xff0c;但我几乎每天都使用这些工具来完善我所写论文中的措辞&#xff0c;并寻求对我被要求评估的工作进行替…

MySQL性能优化 一、系统配置优化

数据库优化纬度有四个&#xff1a; 硬件升级、系统配置、表结构设计、SQL语句及索引。 优化选择&#xff1a; 优化成本&#xff1a;硬件升级 > 系统配置 > 表结构设计 > SQL语句及索引优化效果&#xff1a;硬件升级 < 系统配置 < 标结果设计 < SQL语句及索…

初中物理知识点总结(人教版)

初中物理知识点大全 声现象知识归纳 1 .声音的发生&#xff1a;由物体的振动而产生。振动停止&#xff0c;发声也停止。 2.声音的传播&#xff1a;声音靠介质传播。真空不能传声。通常我们听到的声音是靠空气传来的。 3.声速&#xff1a;在空气中传播速度是&#xff1a;340…

微服务-初级篇

微服务-初级篇 认识微服务1.1 单体架构1.2 分布式架构1.3 微服务 SpringCloud2.1 了解2.2 服务拆分原则2.3 服务拆分效果 Nacos注册中心3.1 认识和安装Nacos3.1.1 Nacos下载3.1.2 Nacos安装 3.2 服务注册到Nacos Feign远程调用4.1 Feign引入4.2 Feign配置 认识微服务 1.1 单体…

Java-01-源码篇-04集合-05-SortedMap NavigableMap TreeMap

目录 一&#xff0c;SortedMap 二&#xff0c;NavigableMap 三&#xff0c;TreeMap 3.1 TreeMap 继承结构 3.2 TreeMap 属性 3.3 TreeMap 构造器 3.4 TreeMap 内部类 3.4.1 Values 3.4.2 KeySet 3.4.3 EntrySet 3.4.5 相关集合迭代器 3.4.5.1 PrivateEntryIterato…

RAID 冗余磁盘阵列

RAID也是Linux操作系统中管理磁盘的一种方式。 只有Linux操作系统才支持LVM的磁盘管理方式。 而RAID是一种通用的管理磁盘的技术&#xff0c;使用于多种操作系统。 优势&#xff1a;提升数据的读写速度&#xff0c;提升数据的可靠性。具体实现哪什么功能&#xff0c;要看你所…

开源六轴协作机械臂myCobot280实现交互式乘法!让学习充满乐趣

本文经作者Fumitaka Kimizuka 授权我们翻译和转载。 原文链接&#xff1a;myCobotに「頷き」「首振り」「首傾げ」をしてもらう &#x1f916; - みかづきブログ・カスタム 引言 Fumitaka Kimizuka 创造了一个乘法表系统&#xff0c;帮助他的女儿享受学习乘法表的乐趣。她可以…

【open3d专栏】利用PCA计算狭长点云的主方向

在点云处理中&#xff0c;PCA通常用于识别数据集中的主要方向&#xff0c;从而帮助理解数据的几何结构。 使用工具&#xff1a;python&#xff0c;open3d库 目的&#xff1a;计算狭长型点云的主方向 # -*- coding: utf-8 -*- """ Created on Sun Jul 7 11:50…

vb.netcad二开自学笔记9:界面之ribbon

一个成熟的软件怎么能没有ribbon呢&#xff0c;在前面的框架基础上再加个命令AddRibbon <CommandMethod("AddRibbon")> Public Sub AddRibbon() Dim ribbonControl As RibbonControl ComponentManager.Ribbon Dim tab As RibbonTab New RibbonTab() tab.Tit…

二手闲置平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;商品购买管理&#xff0c;商品配送管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&a…

新型水冷电阻设计-双面水冷电阻器

一款革命性的电阻器&#xff0c;专为低压和中压应用而设计&#xff0c;尤其是汽车、牵引或船舶系统中的恶劣条件。 EAK采用先进材料制造&#xff0c;采用专利设计&#xff0c;将电阻元件与水基冷却液封装并完全分离&#xff0c;为水冷应用提供模块化、轻量级、小容量、高功率解…

Yet Another Permutation Constructive

这道题目不用写&#xff0c;因为必须要求用kotlin语言 讲一下我做这道题目的过程 我最开始正着想&#xff0c;如果\(k\)比较大的话&#xff0c;我们就想一次删的数少一点&#xff0c;所以考虑一次操作有哪些数被保留&#xff0c;于是我们发现&#xff0c;原序列的极大值点会被保…

从零开始的python学习生活1

python函数的对返回值 本来多个return是不行的 这种语法就能接受多个返回值 def hanshu():return 1,"hello",True x,y,z hanshu() print(x) print(y) print(z)函数的多种传参方式 提前说明白了顺序就无所谓了 关键字传递一个传递参数&#xff0c;一个传递键值…

【数据结构与算法】详解二叉树 上:理论篇——二叉树的基本概念与性质

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​​ 目录 一、树的概念 &#x1f343;树的定义 &#x1f343;树的特点 &#x1f343;树的相…

Dify v0.6.9源码部署

一.前置条件 克隆Dify v0.6.9代码&#xff1a; git clone https://github.com/langgenius/dify.git在启用业务服务之前&#xff0c;需要先部署 PostgresSQL / Redis / Weaviate&#xff08;如果本地没有的话&#xff09;&#xff0c;可以通过以下命令启动&#xff1a; cd do…