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