Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QThread不';工作不好_Qt_Qthread - Fatal编程技术网

QThread不';工作不好

QThread不';工作不好,qt,qthread,Qt,Qthread,这是QTread的子对象。。。 在主螺纹中浇注混凝土 运行时错误如下所示: QCoreApplication::sendEvent中的断言失败:“无法将事件发送到 对象由其他线程拥有。当前线程176f0a8。接收器 ''(类型为'MainWindow')是在线程3976a0中创建的,文件 c:\ndk\u buildrepos\qt desktop\src\corelib\kernel\qcoreapplication.cpp, 第405行传递给C运行时函数的参数无效。无效的 参数传递给C运行时

这是QTread的子对象。。。 在主螺纹中浇注混凝土

运行时错误如下所示:

QCoreApplication::sendEvent中的断言失败:“无法将事件发送到 对象由其他线程拥有。当前线程176f0a8。接收器 ''(类型为'MainWindow')是在线程3976a0中创建的,文件 c:\ndk\u buildrepos\qt desktop\src\corelib\kernel\qcoreapplication.cpp, 第405行传递给C运行时函数的参数无效。无效的 参数传递给C运行时函数

这是大型机的构造函数:

MainWindow::MainWindow(QWidget *parent) :
QWidget(parent)
{
tankPoint = new QRect(50, 50, 30, 30);

this->show();

PaintThread * pt = new PaintThread(this);
pt->start();
}
以下是主窗口的覆盖绘画事件

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()函数中发出它

请至少确保您的问题格式正确。你可以看到(在预览和发布时)你的问题是什么样子的。没有理由有格式错误的代码块。嗯,谢谢。我会记得那样做的..你从另一个线程访问小部件。那不行,QWidget不是线程安全的。您需要从另一个线程发出一个信号,并将其连接到例如小部件的update()插槽。此外,在Qt中,除了主线程外,您不允许在其他线程中使用任何GUI函数(小部件所属的GUI函数,尤其是绘制方法)。非常感谢。。。我已经按照你的提议解决了。。在Qt中,两个线程如何通信?还有其他办法解决吗?(除了信号槽)…再次感谢您…下面是关于qt中线程的进一步文档:谢谢。。。明白。。o(∩_∩)o
void paintEvent(QPaintEvent*) {
    QPainter  p(this);

    p.setPen(Qt::red);
    p.setBrush(Qt::red);
    p.drawEllipse(*tankPoint);

    tankPoint->setLeft(200);
}