如何在 GUI 线程外设置 QWidget 光标

Posted

技术标签:

【中文标题】如何在 GUI 线程外设置 QWidget 光标【英文标题】:How to set QWidget cursor outside the GUI thread 【发布时间】:2009-10-21 07:01:31 【问题描述】:

我正在开发 QT GUI 项目。在这个应用程序中,我有一个 QWidget 作为主窗口。我根据来自某个来源的数据制作光标。当我设置小部件的光标时。它给了我以下错误。 QPixmap:在 GUI 线程之外使用像素图是不安全的 我的代码如下

void ImageWindow::setMouseCursor(unsigned char* data,unsigned char* maskbits,unsigned int length,int xHotSpot, int yHotSpot)

QBitmap bitmapData;
QBitmap bitmapMaskData;
bitmapData.loadFromData(data,length);
bitmapMaskData.loadFromData(maskbits,length);

this->setCursor(QCursor(bitmapData,bitmapMaskData,xHotSpot,yHotSpot));
this->update();

函数setMouseCursor从其他类调用,设置游标的数据。 ImageWindow 是我自定义的 QWidget 类。

【问题讨论】:

【参考方案1】:

据我所知,显然调用 setMouseCursor 的对象位于 GUI 线程之外。为了避免这种情况,请将 setMouseCursor 设置为插槽。不要直接调用槽,而是从调用者对象发出信号,并使用 Qt::QueuedConnection 将该信号连接到 setMouseCursor 槽。

见:ConnectionType

【讨论】:

【参考方案2】:

两个问题:

不要在 GUI 线程之外使用 QBitmap 不要在 GUI 线程之外调用 gui 对象 setCursor

Creating a Paint Device 使用 QImage 作为 油漆设备是可以 保证任何像素的准确性 a中的绘图操作 平台无关的方式。其他 好处是画可以 在另一个线程中执行而不是 当前的 GUI 线程。

【讨论】:

以上是关于如何在 GUI 线程外设置 QWidget 光标的主要内容,如果未能解决你的问题,请参考以下文章

如何将 QWidget 类中的 lineedit 字符串共享到工作线程

在非 GUI 线程中创建 QWidget

QT-如何在 QThread 中使用 QWidget?

PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件

qt如何让控件在单独线程运行

如何在QTabWidget标头中设置QWidget?