这是QTread的子对象...... 并在主线程中具体化....
运行时错误如下:
QCoreApplication :: sendEvent中的ASSERT失败:“无法发送事件 由不同线程拥有的对象。当前线程176f0a8。接收器 ''('MainWindow'类型)是在线程3976a0“,file中创建的 C:\ ndk_buildrepos \ QT-桌面的\ src \ corelib的\核心\ 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();
}
以下是MainWindow的覆盖paintEvent
void paintEvent(QPaintEvent*) {
QPainter p(this);
p.setPen(Qt::red);
p.setBrush(Qt::red);
p.drawEllipse(*tankPoint);
tankPoint->setLeft(200);
}
谁能告诉我为什么?
答案 0 :(得分:3)
父级(在本例中为您的MainWindow)位于不同的线程中。根据Qt文档
您可以使用线程安全函数QCoreApplication :: postEvent()随时手动将事件发布到任何线程中的任何对象。事件将由创建对象的线程的事件循环自动分派。 所有线程都支持事件过滤器,但监视对象必须与受监视对象位于同一线程中。类似地,QCoreApplication :: sendEvent()(与postEvent()不同)只能用于将事件分派给生成在函数调用的线程中的对象。
作为解决方案,我建议如下: