我每次尝试获取框架时都尝试更新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()

上述解决方案从技术上打破了无限的交叉引用循环。但是,可以做得更好。有可能从外部调用方多次触发oj​​it_code。在这种情况下,许多计时器将被激活。
看来您只需要一个setH()实例即可独立于QTimer周期性地调用updatehand()。因此,setH()可以在给定的期间内合并到更新的数据中。它可以直接调用updatehand()setH()函数仅设置setH()文本:
void MainWindow::setH(const QString hndc){
    handsRead->setText(hndc);
}

09-08 04:38