Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运行时QT更新Linedit_C++_Qt - Fatal编程技术网

C++ 运行时QT更新Linedit

C++ 运行时QT更新Linedit,c++,qt,C++,Qt,我试图在每次获得帧时更新linedit上的文本,但我的程序崩溃了。我尝试对循环执行相同的操作,但窗口仅在循环完成后显示。setH()是我的插槽,在调试模式下它运行得很好,问题是在程序运行时尝试更新LineEdit中的文本(主窗口在屏幕上)。多谢各位 void MainWindow::updatehand(){ if (controller.isConnected()){ int hc =frame.hands().count(); QString hndc= QStrin

我试图在每次获得帧时更新linedit上的文本,但我的程序崩溃了。我尝试对循环执行相同的操作,但窗口仅在循环完成后显示。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();
}

这是坠机的原因:

connect(this, SIGNAL(hChanged(const QString)), this, SLOT(setH(const QString)));
这种连接实际上是一个直接的函数调用。调用函数
setH()
代替
emit-hChanged(hndc)。然后从
setH()
调用函数
updatehand()

这是一个具有堆栈溢出崩溃的无限循环


如果要每秒调用
updatehand()
60次,可以使用
QTimer
调用,例如使用
QTimer
statics成员:

void MainWindow::setH(const QString hndc){
    handsRead->setText(hndc);
    QTimer::singleShot(1000 / 60, this, SLOT(updatehand()));
}
这里的
updatehand()
也是一个插槽

在这种情况下,偶数循环在从
setH()
返回后继续发送UI消息

大约16毫秒后,计时器将调用
updatehand()


上述解决方案在技术上打破了无限交叉引用循环。然而,它可以做得更好。存在一种风险,即外部调用者会多次触发
setH()。在这种情况下,许多定时器将被激活。
看起来您只需要一个
QTimer
实例就可以周期性地调用
updatehand()
,独立于
setH()
。因此,
updatehand()
可以在给定的时间段内汇集到更新的数据中。它可以直接调用
setH()
,而
setH()
函数只设置
QLineEdit
文本:

void MainWindow::setH(const QString hndc){
    handsRead->setText(hndc);
}

main window::handsRead
静态变量?是否将信号
hChanged()
连接到插槽
setH()
?插槽
setH()
何时触发?连接(此,信号(hChanged(const QString)),此,插槽(setH(const QString))@drescherjm:这不是静态的。谢谢你的回答,我尝试过用循环更新Lineedit,但是窗口只有在循环完成后才会显示。有没有办法在我得到它时更新主窗口Lineedit上的文本。@David你真的需要这些函数之间的交叉引用?我猜还有一些外部调用程序触发循环调用
hChanged()
setH()
。您将如何操作,我从帧中获取一个帧,并从帧中获取所需内容,并希望在LinEdit中显示该信息。@David请澄清您的任务。为什么在
setH()
中调用
updatehand()
,对象
frame
是什么?以创建新的框架并从该框架中获取信息。显示主窗口后,QT是否允许修改LineEdit?