c++ - 如何将回调与 QPlainTextEdit 更改连接起来?

标签 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: Cannot queue arguments of type 'QTextBlock' (Make sure 'QTextBlock' is registered using qRegisterMetaType().) QObject: Cannot create children for a parent that is in a different thread. (Parent is QTextDocument(0x227e580), parent's thread is QThread(0x1f9db50), current thread is QThread(0x7f4ae40011d0)

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

最佳答案

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

Maybe using a signal-slot design?

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

关于c++ - 如何将回调与 QPlainTextEdit 更改连接起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49614168/

相关文章:

javascript - Webassembly:可能有共享对象吗?

c++ - 为什么我不能像使用 std::string::size_type 那样使用 QList::size_type? (模板参数错误)

c++ - 从 DLL 返回的值在直接 g++ 和使用 g++ 的 qt 之间有所不同

c++ - 对 boost::system 的 undefined reference

c++ - Ogre 中的纹理坐标

c++ - 什么时候应该使用this->?

C++:构造函数中的多维数组初始化

c++ - 使用 Qt 和 Boost 为应用程序编译 CppUTest 测试时的奇怪行为

ros - 如何从激光传感器数据制作占用网格图?

c++ - 在 vim 中,如何创建一个命令来记住光标下的单词?