我每次尝试获取框架时都尝试更新linedit上的文本,但是程序崩溃。我尝试对循环执行相同的操作,但是仅在循环完成后才显示窗口。 setH()是我的插槽,在Debug模式下,它可以完美运行,问题是在程序运行时(主窗口在屏幕上)尝试在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();
}
最佳答案
这是崩溃的原因:
connect(this, SIGNAL(hChanged(const QString)), this, SLOT(setH(const QString)));
这种连接通常是直接函数调用。调用
setH()
函数代替emit hChanged(hndc);
。然后从updatehand()
调用函数setH()
。这是一个堆栈溢出崩溃的无限循环。
如果您想每秒调用
updatehand()
60次,则可以使用QTimer
进行调用,例如,使用QTimer
statics memember:void MainWindow::setH(const QString hndc){
handsRead->setText(hndc);
QTimer::singleShot(1000 / 60, this, SLOT(updatehand()));
}
这里
updatehand()
也是一个插槽。在那种情况下,even循环从
setH()
返回后继续调度UI消息。大约在16 ms之后,计时器将调用
updatehand()
。上述解决方案从技术上打破了无限的交叉引用循环。但是,可以做得更好。有可能从外部调用方多次触发ojit_code。在这种情况下,许多计时器将被激活。
看来您只需要一个
setH()
实例即可独立于QTimer
周期性地调用updatehand()
。因此,setH()
可以在给定的期间内合并到更新的数据中。它可以直接调用updatehand()
,setH()
函数仅设置setH()
文本:void MainWindow::setH(const QString hndc){
handsRead->setText(hndc);
}