【问题标题】:How to connect callback with QPlainTextEdit change?如何将回调与 QPlainTextEdit 更改连接?
【发布时间】:2018-09-11 20:11:05
【问题描述】:

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

此函数创建 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”类型的参数排队(使 确保使用 qRegisterMetaType() 注册“QTextBlock”。) QObject: 无法为不同线程中的父级创建子级。 (父母是QTextDocument(0x227e580),父母的线程是 QThread(0x1f9db50),当前线程为QThread(0x7f4ae40011d0)

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

【问题讨论】:

  • Signals/slots 与使用回调不太一样,所以最好不要混淆概念(书面或思考)。
  • 错误消息表明(可能)带有连接的QObject 派生类的实例已移至新的QThread,但仍可从原始线程直接访问。您需要查明这些消息的来源。您可以尝试使用qInstallMessageHandler 安装自定义消息处理程序并在调试器下运行以在消息发出时获取调用堆栈。

标签: c++ qt ros


【解决方案1】:

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

也许使用信号槽设计?

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

【讨论】:

  • 现在在回调中我发送一个信号来激活一个添加文本的插槽,它工作正常。
猜你喜欢
  • 2015-08-21
  • 2018-10-15
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2014-06-05
  • 2016-02-29
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多