【问题标题】:update QLineEdit value every n seconds每 n 秒更新一次 QLineEdit 值
【发布时间】:2012-11-18 19:56:45
【问题描述】:

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

    stillWorking = true;
    while(stillWorking){
        ui->editElement->setText(QString::number(getVariableValue()));
        qDebug() << 'running!!!'
        Sleep(1000);
    }

当单击某个按钮时,stillWorking 布尔值设置为 false。这就是我希望停止这个循环的方式。但是,当我执行代码时,editElement 没有更新,应用程序停止响应。但是,'running!!!' 字符串每秒都很好地打印在调试部分。那么,还有其他方法可以访问和显示我的变量吗?

【问题讨论】:

  • 为什么不能使用QThread?不使用它有什么好处,如果你使用 QLineEdit,你已经对 Qt 产生了依赖。
  • 因为它是项目的一部分。所有线程都应该使用 WinAPI 线程函数(信号量、互斥量、...等...)来完成。

标签: qt refresh qlineedit


【解决方案1】:

你应该使用QTimer,假设你被允许(即使你被允许使用线程)。对 UI 线程进行任何形式的阻塞都不起作用,需要释放它才能使事件处理工作,并且对点击做出反应需要事件处理。

Timers 页面有更多信息和如何使用它的示例。这里的想法是创建一个简单的插槽:

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

以及连接到该插槽的重复计时器。

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

【讨论】:

  • 一个好主意。我在 google 上阅读了 QTimer 的页面和其他一些示例。但似乎我无法通过 SLOT 参数中的函数传递参数(只是类型)。那么如何更新特定的 QLineEdit?为每个 QLineEdit 创建一个插槽会耗费时间并浪费大量代码,要显示的变量太多。
  • 不确定我是否理解您的设置,但似乎您可以在一个插槽中完成所有更新,或者至少将 ui 元素放在可同时更新的可管理数量的组中。 (不能将任何参数传递给定时器触发的槽。)
  • 好吧,我尽力了。通过更改我的代码,我设法使用了没有参数的插槽(许多插槽)。现在它得到错误:QEventDispatcherWin32::registerTimer: Failed to create a timer (???)。谷歌搜索但没有有用的结果。
  • 耶啊啊!!!我应该创建一个 QTimer 对象,而不是像示例中那样使用单次静态方法。它现在完美运行!谢谢!!!
【解决方案2】:

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

第一个是上面的 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

}

在你的函数中 如果 while 循环中断,则更新您的可见小部件,否则您的应用程序可以工作,但在循环过程中不更新任何 gui 小部件。

【讨论】:

    猜你喜欢
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2022-10-20
    相关资源
    最近更新 更多