如何在 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 字符串共享到工作线程