QT在运行时更新Linedit

时间:2015-09-23 21:45:47

标签: c++ qt

每次我拿到一个框架时,我都会尝试更新我的文本中的文字,但程序崩溃了。我尝试用循环做同样的事情,但窗口只在循环结束后显示。 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();
}

1 个答案:

答案 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);
}