这是 QTread 的子对象...
并将其具体化在主线程中......
运行时错误如下:
QCoreApplication::sendEvent 中的 ASSERT 失败:“无法将事件发送到
不同线程拥有的对象。当前线程 176f0a8。接收者
''(类型为“MainWindow”)是在线程 3976a0 中创建的”,文件
c:\ndk_buildrepos\qt-desktop\src\corelib\kernel\qcoreapplication.cpp,
第 405 行 传递给 C 运行时函数的参数无效。无效的
传递给 C 运行时函数的参数。
class PaintThread : public QThread {
private:
QWidget* parent;
public:
~PaintThread() {}
PaintThread(QWidget* parent = 0) {
this->parent = parent;
}
void run() {
while (1) {
this->msleep(5000);
parent->repaint();
}
this->exec();
}
};
这是 MainFrame 的构造函数:
MainWindow::MainWindow(QWidget *parent) :
QWidget(parent)
{
tankPoint = new QRect(50, 50, 30, 30);
this->show();
PaintThread * pt = new PaintThread(this);
pt->start();
}
以下是主窗口的重写paintEvent
void paintEvent(QPaintEvent*) {
QPainter p(this);
p.setPen(Qt::red);
p.setBrush(Qt::red);
p.drawEllipse(*tankPoint);
tankPoint->setLeft(200);
}
谁能告诉我为什么?
父级(在本例中为您的主窗口)位于不同的线程中。根据Qt文档
您可以随时使用线程安全函数 QCoreApplication::postEvent() 手动将事件发布到任何线程中的任何对象。事件将由创建对象的线程的事件循环自动调度。
所有线程都支持事件过滤器,但限制是监视对象必须与被监视对象位于同一线程中。类似地,QCoreApplication::sendEvent()(与 postEvent() 不同)只能用于将事件分派给调用该函数的线程中的对象.
因此,作为解决方案,我提出以下建议:
- 在 PaintThread 类中定义一个信号
- 将此信号连接到 QWidget 子类中的 Paint() 插槽
- 在 run() 函数中发出它
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)