QThread运行不正常

时间:2012-01-26 13:00:55

标签: qt qthread

这是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);
}

谁能告诉我为什么?

1 个答案:

答案 0 :(得分:3)

父级(在本例中为您的MainWindow)位于不同的线程中。根据Qt文档

  

您可以使用线程安全函数QCoreApplication :: postEvent()随时手动将事件发布到任何线程中的任何对象。事件将由创建对象的线程的事件循环自动分派。   所有线程都支持事件过滤器,但监视对象必须与受监视对象位于同一线程中。类似地,QCoreApplication :: sendEvent()(与postEvent()不同)只能用于将事件分派给生成在函数调用的线程中的对象

作为解决方案,我建议如下:

  • 在PaintThread类中定义信号
  • 将此信号连接到QWidget子类
  • 中的paint()插槽
  • 在run()函数中发出它