gpt4 book ai didi

c++ - QWidget 外部 GUI 线程上的绘画问题

转载 作者:IT王子 更新时间:2023-10-29 00:54:29 25 4
gpt4 key购买 nike

我正在开发一个应用程序,我想在其中连续接收来自远程主机的图像并将它们显示在我的屏幕上。为此,我遵循给定的策略1)我有一个主要的 QWidget 对象,其中包含 QImage(工作正常)2) 从远程主机接收到的图像被绘制在 QImage 对象上,这项工作是在工作线程中使用 QPainter 完成的。 (工作正常)3)但问题是图像没有在 QWidget 上更新,除非我调整小部件的大小,因为重绘事件是为 QWidget 调用的......现在如果我从工作线程重绘 QWidget,它会给出错误“QPixmap:它是在 GUI 线程之外使用像素图是不安全的”.. 和应用程序崩溃。

对此有任何帮助吗?

最佳答案

使用 QueuedConnection 从工作线程发出信号
或者从工作线程向小部件发送更新事件(QPaintEvent)。

//--------------Send Queued signal---------------------
class WorkerThread : public QThread
{
//...
signals:
void updateImage();

protected:
void run()
{
// construct QImage
//...
emit updateImage();
}
//...
};

//...
widgetThatPaintsImage->connect(
workerThread,
SIGNAL(updateImage()),
SLOT(update()),
Qt::QueuedConnection);
//...

//--------------postEvent Example-----------------------
class WorkerThread : public QThread
{
//...
protected:
void run()
{
//construct image
if(widgetThatPaintsImage)
{
QCoreApplication::postEvent(
widgetThatPaintsImage,
new QPaintEvent(widgetThatPaintsImage->rect()));
}
//...
}

private:
QPointer<QWidget> widgetThatPaintsImage;
};

不要忘记同步对图像的访问。
作为同步的替代方法,您还可以将图像发送到 gui 线程,就像在 Mandelbrot Example 中一样。 .

关于c++ - QWidget 外部 GUI 线程上的绘画问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1508151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com