Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在非GUI线程中生成QPixmap

在非GUI线程中生成QPixmap
EN

Stack Overflow用户
提问于 2018-04-02 15:22:50
回答 1查看 861关注 0票数 3

在我的项目中,我需要根据收集的数据生成数千个唯一的QPixmap变量。

这些数据是在工作线程中收集的,因为它可能有点慢。在线程工作结束时,它将创建一个包含所有小QPixmaps的大映像。但是,不能创建QPixmaps,QPainter不能在非GUI线程中工作。

首先,我决定在线程已经完成之后完成所有的QPixmap生成,但是这太慢了。将数据转换为可以转换为QPixmap的东西只需足够长的时间,就会导致可见的口吃。

如何从工作线程内部生成QPixmaps,使程序不打嗝?

耽误您时间,实在对不起。

编辑:有人要求提供一个小例子:

代码语言:javascript
运行
AI代码解释
复制
QImage image(8, 8, QImage::Format_ARGB32_Premultiplied);
image.fill(Qt::transparent);

QPainter p(&image);

for(int x=0; x<16; x+=2)
{
    for(int z=0; z<16; z+=2)
    {
        quint16 id = blockData[0][x][z];
        quint8 data = id/4096;
        id = id-(data*4096);

        p.setPen(QColor("#ff0000"));
        p.drawPoint(x/2, z/2);
    }
}

p.end();

    chunkResponse->blocks = QPixmap::fromImage(image);

产出如下:

代码语言:javascript
运行
AI代码解释
复制
QPainter::setPen: Painter not active
QPainter::drawPoints: Painter not active
QPainter::end: Painter not active, aborted
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-02 16:01:17

您不必使用QPixmap,而是使用QImage,最后使用从QPixmap转换的内容通过信号发送:

代码语言:javascript
运行
AI代码解释
复制
#include <QtWidgets>

struct Chunk
{
    QImage blocks;
    QDateTime time;
};

Q_DECLARE_METATYPE(Chunk)

class Thread: public QThread{
    Q_OBJECT
public:
    using QThread::QThread;
    ~Thread() { quit(); wait();}
    Q_SIGNAL void sendChunk(const Chunk &);
protected:
    void run() override{

        while (true) {

            Chunk chunkResponse;
            QImage image(128, 128, QImage::Format_ARGB32_Premultiplied);
            image.fill(Qt::transparent);

            QPainter p(&image);

            for(int x=0; x<256; x+=2)
            {
                for(int z=0; z<256; z+=2)
                {
                    QColor color(qrand() % 256, qrand() % 256, qrand() % 256);
                    p.setPen(color);
                    p.drawPoint(x/2, z/2);
                }
            }

            p.end();
            chunkResponse.blocks = image;
            chunkResponse.time = QDateTime::currentDateTime();
            Q_EMIT sendChunk(chunkResponse);
            QThread::msleep(10);
        }
    }
};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLabel w;
    w.setFixedSize(128, 128);
    Thread thread;
    QObject::connect(&thread, &Thread::sendChunk, [&](const Chunk & chunk){
        w.setPixmap(QPixmap::fromImage(chunk.blocks));
        qDebug()<<chunk.time.toString();
    });
    thread.start();
    w.show();
    return a.exec();
}

#include "main.moc"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49620108

复制
相关文章
如何让Task在非线程池线程中执行?
Task承载的操作需要被调度才能被执行,由于.NET默认采用基于线程池的调度器,所以Task默认在线程池线程中执行。但是有的操作并不适合使用线程池,比如我们在一个ASP.NET Core应用中承载了一些需要长时间执行的后台操作,由于线程池被用来处理HTTP请求,如果这些后台操作也使用线程池来调度,就会造成相互影响。在这种情况下,使用独立的一个或者多个线程来执行这些后台操作可能是一个更好的选择。
蒋金楠
2023/05/31
8120
如何让Task在非线程池线程中执行?
Python Qt GUI设计:QPainter、QPen、QBrush和QPixmap窗口绘图类(基础篇—17)
本篇博文主要介绍如何实现在窗口中绘图,在 PyQt5中,一般可以通过QPainter、QPen、QBrush和QPixmap这四个类来实现绘图功能。其中,QPixmap的作用是加载并呈现本地图像,而图像的呈现本质上也是通过绘图方式实现的。
不脱发的程序猿
2021/10/26
2.3K0
PyQt5--QPixmap
1 # -*- coding:utf-8 -*- 2 ''' 3 Created on Sep 20, 2018 4 5 @author: SaShuangYiBing 6 7 Comment: 8 ''' 9 import sys 10 from PyQt5.QtGui import QPixmap 11 from PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QLabel 12 13 class New_test
py3study
2020/01/19
3060
在非容器环境中实现DevOps
采用DevOps方式实现软件交付的原因之一是为了消除生产部署过程中的瓶颈,对于服务器端软件,通常涉及以下部分: ☘ 应用程序环境,如操作系统参数 ☘ 第三方组件,如应用程序服务器,web服务器和数据库 ☘ 顶部运行的应用软件 为了消除部署瓶颈,DevOps旨在打破开发人员和IT运营人员之间的障碍(也是DevOps得名的原因),以促进协作的工作环境。因此,需要确保生产环境与开发环境保持同步,并且所有部署过程一起执行。实现这一目标的方式之一是通过使用容器,如Docker或Kubernetes
SDNLAB
2018/03/29
1.4K0
Qt使用QPixmap小坑
  既然报关于QPixmap的错误提示,我们先找找QPixmap的官方文档吧。找了一遍,找到了一个有点关系的注意事项:
Qt君
2023/03/17
1.8K0
Qt使用QPixmap小坑
python gui中线程的调用
""" ################################################################################# System-wide thread interface utilities for GUIs.
用户5760343
2022/05/13
3760
Qt CMake GUI项目生成脚本
脚本同级目录下有一个标准的项目工作目录,此目录是为了提供一个标准的工程项目模板而存在的,结构如上述脚本构建的标准项目目录。而脚本的工作原理就是通过读入你设置的工程名和可执行文件名之后复制一份标准工程目录然后通过字符串定位修改相应值从而产生一个新的通用编辑器的工程了。
impressionyang
2020/08/26
7140
用 OneDriver GUI 工具在 Linux 中挂载微软 OneDrive
在 Windows 上,微软提供了一个 免费云存储服务 OneDrive。它与 Windows 集成,你可以通过你的微软账户获得 5GB 的免费存储空间。
用户8639654
2021/09/13
3.4K0
thread 守护线程_守护线程与非守护线程
  Java中线程分为用户线程(user thread)和守护线程(daemon thread),它们通过Thread的daemon属性标识:true表示守护线程,false表示用户线程。   一个Thread初始默认为用户线程(daemon默认为false),创建Thread的时候默认从当前线程”继承”daemon属性,见Thread.init方法:
全栈程序员站长
2022/11/04
5030
在docker中通过X11运行gui程序
我们都知道Docker是一个开源项目,提供了一个打包、分发和运行任意程序的轻量级容器的开放平台。它没有语言 支持、框架或者打包系统的限制,并可以运行在任何地方、任何时候,从小型的家用电脑到高端的服务器都可以运行。这让人们可以打包不同的包用于部署和扩展网 络应用,数据库和后端服务而不必依赖于特定的栈或者提供商。
羽翰尘
2019/11/20
10.9K0
用 OneDriver GUI 工具在 Linux 中挂载微软 OneDrive
在 Windows 上,微软提供了一个 免费云存储服务 OneDrive。它与 Windows 集成,你可以通过你的微软账户获得 5GB 的免费存储空间。
用户1880875
2021/09/07
3.1K0
postman入门 -5 newman实现非GUI方式运行
newman run "用例文件路径\\文件名.json" -e "环境变量文件路径\\文件名.json" -g "全局变量文件路径\\文件名.json" -r cli,html,json,junit --reporter-html-export "测试报告保存的路径 \\报告名.html"
孟船长
2022/02/23
3450
postman入门 -5 newman实现非GUI方式运行
python pyqt5 QPixmap
import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *
用户5760343
2019/07/05
6670
Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)
     当java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue 和 AWT-Windows。 AWT-EventQuecue 线程负责处理GUI事件,AWT-EventQuecue线程负责将窗体或组件绘制到桌面。JVM保证各个线程都有使用CPU资源的机会.    样列: 1 package tes; 2 3 import java.awt.Color; 4 import java.awt.Fl
Gxjun
2018/03/26
1.8K0
Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)
非线程安全对象�
今天的微博有人讨论到对象池,我想到之前项目的实现,应该用模板来实现啊,唉,还是被前人的想法给框定了,只是实现一个特别简单,花了几分钟写了个:
全栈程序员站长
2022/07/12
2510
jmeter-可视化的非GUI模式
执行脚本很方便,看结果也很方便,但是GUI模式消耗资源,对测试结果的准确性影响很大
飞天小子
2019/09/04
1.1K0
jmeter-可视化的非GUI模式
在多线程处理任务中,防止线程过度竞争
对于后台的多线程处理任务,通常采取以下几种优化措施来防止线程过度竞争导致的性能下降:
一凡sir
2023/08/24
4650
使用非root用户在容器中运行celery
在 docker 环境中, 如果使用 root 用户运行 celery worker会有下面才警告出现. 虽然可以通过C_FORCE_ROOT环境变量来避免这个问题。 但毕竟 celery 官方并不推荐使用 root。好在 docker-compose 有user参数指定用户.
用户1416054
2018/08/02
3.1K0
使用 PyAutoGUI 库在 Python 中自动化 GUI 交互
PyAutoGUI是一个很棒的模块,用于自动化Python应用程序中的图形用户界面交互。它使开发人员能够模仿用户输入并自动执行重复操作,使其成为测试、数据输入和其他需要与 GUI 交互的工作的理想选择。PyAutoGUI是一个跨平台的库,支持所有主要的操作系统,如Windows,Linux和macOS。
很酷的站长
2023/08/11
7060
使用 PyAutoGUI 库在 Python 中自动化 GUI 交互
Python 脚本 GUI 界面生成工具
对于一些 Python 脚本,我们想把它打包给其他人使用,不是黑色的命令行框,而是打包成一个有界面的程序包给别人,让普通用户也能用上是多么酷的事啊。
用户6825444
2020/01/14
2.6K0
Python 脚本 GUI 界面生成工具

相似问题

QPixmap和GUI线程化

10

GUI线程外的QPixmap不安全

23

在非GUI线程中创建QWidget

13

在非主线程中运行Cocoa GUI

30

在非gui线程上创建窗体

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文