如何连接回调与QPlainTextEdit更改?

时间:2018-04-02 15:38:00

标签: c++ qt ros

我正在收听一个主题,并希望每次更改时都显示和更新收到的值。

此函数创建GUI的日志记录部分

  QGroupBox *Window::startLoggingGroup()
  {
      QGroupBox *groupBox = new QGroupBox(tr("Logging"));

      log_value = new QPlainTextEdit;
      log_value->setReadOnly(true);
      log_value->setPlaceholderText("Value will appear here \n");

      QHBoxLayout *hbox = new QHBoxLayout;
        hbox->addWidget(log_carrot);

      groupBox->setLayout(hbox);
      return groupBox;

  }

这是对每个更改值执行的代码。

void EFISWindow::callback_value(const geometry_msgs::PoseStamped& msg){
    QString qst = QString::number(msg.pose.position.z);
    log_value->setPlainText(qst);

}

它首先起作用,我可以看到GUI和一些值,但在我现在显示的几条消息之后它崩溃了:

  

QObject :: connect:无法对“QTextBlock”类型的参数进行排队(Make   确定'QTextBlock'是使用qRegisterMetaType()注册的。)QObject:   无法为位于其他线程中的父级创建子级。   (Parent是QTextDocument(0x227e580),父级的线程是   QThread(0x1f9db50),当前线程为QThread(0x7f4ae40011d0)

如何解决此线程问题?也许使用信号槽设计?我真的不明白为什么这不起作用。

1 个答案:

答案 0 :(得分:3)

您不应该从另一个线程访问GUI元素。

  

也许使用信号槽设计?

是的,您的工作对象应该有一个您在某个时刻发出的信号,您应该连接该信号以更新“log_value”值。