【问题标题】:QT add Item trigger redraw, not freezingQT添加Item触发重绘,不冻结
【发布时间】:2016-01-18 20:04:02
【问题描述】:

我是第一次使用 QT,在添加元素时刷新 GUI 时遇到了一些问题。

代码如下:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

   PObj obj;
   MainWindow mw;
   qRegisterMetaType<std::string>();

   QObject::connect(&obj, SIGNAL(setText(std::string const&)),
                    &mw, SLOT(appendText(std::string const&)));

   QFuture<void> f1 = QtConcurrent::run(&obj, &PObj::process);
   mw.show();

    f1.waitForFinished();

    return a.exec();
}

使用 PObj::process 定义:

void PObj::process()
{
for(; ;)
{
    sleep(1);

    //do work and set text
     std::string text = "bla";
     emit setText( text );
}
}

还有 MainWindow::appendText 槽:

void MainWindow::appendText(std::string const& str )
{
    ui->listWidget->addItem(QString::fromStdString(str));
}

我试过放置 qApp->processEvents() ,QCoreApplication::processEvents(); ... 在 ThreadPool 中运行机智的未来。

我认为使用 Concurrent::run 运行它们就足够了?

更新:

问题是,为什么 GUI 不是每秒刷新一个新项目?

【问题讨论】:

  • @hyde,你说得对,我编辑了问题

标签: qt


【解决方案1】:

f1.waitForFinished(); 调用阻塞直到f1 完成,顾名思义。这永远不会发生,因为您有无限循环。所以你的代码永远不会进入主循环。你不能这样阻塞主线程!一般来说,避免使用任何 WaitForXxxx() 方法,尤其是 GUI 线程。

另外,你无法停止process();无论如何,所以等待它完成没有任何意义......您可能想要添加一种方法来告诉它停止(例如原子变量)但无论如何,要解决您的问题,只需删除 f1.waitForFinished(); 行.

要很好地终止任务,请尝试添加QAtomicInt 标志(不是 volatile boolean,它不会这样做),然后像这样更改代码:

将成员变量添加到PObj(应该将其设为私有并添加setter):

    QAtomicInt termianteFlag;

像这样更改主要内容:

int main(int argc, char *argv[])
{
    ///snip

    QFuture<void> f1 = QtConcurrent::run(&obj, &PObj::process);
    mw.show();

    int ret = a.exec();
    f1.terminateFlag = 1; // change this to setter method
    f1.waitForFinished(); // this is not ideal, will wait for up to a second before exit

}

void PObj::process()
{
    while(!terminateFlag)
    {
        sleep(1);

        //do work and set text
         std::string text = "bla";
         emit setText( text );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2014-08-30
    • 2012-07-14
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多