我正在收听一个主题,并希望在每次更改时显示和更新接收到的值。
此函数创建 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/