Qt 每n秒更新一次QLineEdit值

Qt 每n秒更新一次QLineEdit值,qt,refresh,qlineedit,Qt,Refresh,Qlineedit,一个初学者的问题,但实际上我被卡住了。我不允许使用“高级”C++线程函数(也不使用线程,也不使用Q线程)。但是,我应该使用winAPI函数createThread创建一些线程。这些线程用来改变一些变量。我想在QLineEdit组件中每1秒显示一次这些变量。所以我尝试了这样的代码: stillWorking = true; while(stillWorking){ ui->editElement->setText(QString::number(getV

一个初学者的问题,但实际上我被卡住了。我不允许使用“高级”C++线程函数(也不使用线程,也不使用Q线程)。但是,我应该使用winAPI函数createThread创建一些线程。这些线程用来改变一些变量。我想在QLineEdit组件中每1秒显示一次这些变量。所以我尝试了这样的代码:

    stillWorking = true;
    while(stillWorking){
        ui->editElement->setText(QString::number(getVariableValue()));
        qDebug() << 'running!!!'
        Sleep(1000);
    }
stillWorking=true;
当(仍在工作){
ui->editElement->setText(QString::number(getVariableValue());
qDebug()您应该使用,假设您被允许(即使您被允许使用线程)。在UI线程上执行任何类型的阻塞都不起作用,需要释放它才能使事件处理工作,对单击的反应需要事件处理

该页面提供了更多的信息和如何使用它的示例。这里的想法是创建一个插槽,它只需执行以下操作:

ui->editElement->setText(QString::number(getVariableValue()));
和一个连接到该插槽的重复计时器


(这假设
getVariableValue()
已正确同步,并且确实可以看到来自另一个线程的更新值。)

您可以使用这两种方法中的任何一种

第一个在上面的Mat中解释

第二种方法是,如果您的类派生自QObject,则可以重写timerEvent

class MyObject : public QObject
{
    Q_OBJECT

public:
    MyObject(QObject *parent = 0);

int timerID;


protected:
    void timerEvent(QTimerEvent *event);
};

MyObject::MyObject(QObject *parent)
    : QObject(parent)
{

    timerID = startTimer(1000);   // 1-second timer

}

void MyObject::timerEvent(QTimerEvent *event)
{

    ui->editElement->setText(QString::number(getVariableValue()));

    this->killTimer(timerID); // you can use here if you plan stop timer

}
在你的职责范围内
如果循环中断,则会更新可见小部件,否则应用程序会工作,但在循环中处理时不会更新任何gui小部件。

为什么不能使用QThread?不使用它会有什么好处?如果使用QLineEdit,您已经依赖于Qt。因为它是项目的一部分。所有线程都应该使用WinAPI threading f完成函数(信号量、互斥等)。这是个好主意。我在google上阅读了该页面和其他一些QTimer示例。但似乎我无法通过SLOT参数中的函数传递参数(仅是类型)。那么我如何更新特定的QLineEdit?为每个QLineEdit创建一个插槽将耗费大量时间和代码,因为有太多的变量要显示。我不确定我是否理解您的设置,但似乎您可以在单个插槽中进行所有更新,或者至少将ui元素放在可管理的组中,以便在t时更新同时。(您不能将任何参数传递给计时器触发的插槽。)嗯,我尽了最大努力。通过更改代码,我成功地使用了插槽(许多插槽)而没有参数。现在出现错误:
QEventDispatcherWin32::RegisterItemer:无法创建计时器(???)
。谷歌搜索了它,但没有得到任何有用的结果。Yeeaaahh!!!我应该创建一个QTimer对象,而不是像示例中那样使用单发静态方法。它现在工作得很好!谢谢!!!