我正在收听一个主题,并希望每次更改时都显示和更新收到的值。
此函数创建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)
如何解决此线程问题?也许使用信号槽设计?我真的不明白为什么这不起作用。
答案 0 :(得分:3)
您不应该从另一个线程访问GUI元素。
也许使用信号槽设计?
是的,您的工作对象应该有一个您在某个时刻发出的信号,您应该连接该信号以更新“log_value”值。