【发布时间】:2014-03-17 10:44:16
【问题描述】:
这是 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();
}
下面是MainWindow的overridepaintEvent
void paintEvent(QPaintEvent*) {
QPainter p(this);
p.setPen(Qt::red);
p.setBrush(Qt::red);
p.drawEllipse(*tankPoint);
tankPoint->setLeft(200);
}
谁能告诉我为什么?
【问题讨论】:
-
请至少确保您的问题格式正确。您可以看到(在预览中和发布时)您的问题是什么样的。没有理由有错误格式的代码块。
-
嗯,谢谢。我会记得这样做..
-
您从另一个线程访问小部件。那行不通,QWidget 不是线程安全的。您需要从另一个线程发出信号并将其连接到例如小部件的 update() 插槽。