每次我拿到一个框架时,我都会尝试更新我的文本中的文字,但程序崩溃了。我尝试用循环做同样的事情,但窗口只在循环结束后显示。 setH()是我的插槽,在调试模式下运行完美,问题是当程序运行时(主窗口在屏幕上)尝试更新LineEdit中的文本时。谢谢
void MainWindow::updatehand(){
if (controller.isConnected()){
int hc =frame.hands().count();
QString hndc= QString::number(hc);
emit hChanged(hndc);
}
void MainWindow::setH(const QString hndc){
handsRead->setText(hndc);
updatehand();
}
答案 0 :(得分:1)
这是崩溃的原因:
connect(this, SIGNAL(hChanged(const QString)), this, SLOT(setH(const QString)));
这种连接实际上是一个直接的函数调用。调用函数setH()
代替emit hChanged(hndc);
。然后从updatehand()
调用函数setH()
。
这是一个无限循环,堆栈溢出崩溃。
如果您想每秒拨打updatehand()
60次,可以使用QTimer
进行呼叫,例如QTimer
静态信息:
void MainWindow::setH(const QString hndc){
handsRead->setText(hndc);
QTimer::singleShot(1000 / 60, this, SLOT(updatehand()));
}
此处updatehand()
也是一个广告位。
在这种情况下,偶数循环在从setH()
返回后继续分派UI消息。
大约16 ms后,计时器将调用updatehand()
。
上述解决方案在技术上打破了无限交叉引用循环。但是,它可以做得更好。存在从外部呼叫者多次触发setH()
的风险。在这种情况下,将激活许多计时器。
看起来您只需要一个QTimer
个实例来独立于updatehand()
调用periodiacally setH()
。因此,updatehand()
可以与给定时段汇总更新数据。它可以直接拨打setH()
,setH()
功能只设置QLineEdit
文字:
void MainWindow::setH(const QString hndc){
handsRead->setText(hndc);
}