【发布时间】: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 安装自定义消息处理程序并在调试器下运行以在消息发出时获取调用堆栈。