0

我使用的片段如下

QDirIterator it(dir, filters, QDir::NoDotAndDotDot | QDir::AllEntries , QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
    while(it.hasNext())
    {
        it.next();
        if(QFileInfo(it.filePath()).isFile())
        {
            QString name=it.fileName();
            ui->textBrowser_filename->append(name);
        }
    }

它遍历所有目录,而不是像我所说的那样逐个显示文件名,而是一次性显示 textBrowser 的内容。发生了什么事?

4

2 回答 2

0

我同意史蒂夫回答的第一部分:对 GUI 的更新很昂贵,并且只有在控制返回到 Qt 主应用程序事件循环时才会发生。

但是,与其processEvents()在循环中手动调用(通常应该避免),我建议通过连接所有要添加的文件名来构造一个字符串,然后只调用一次QTextBrowser::append()函数。

像这样:

QStringList list;
while (it.hasNext()) {
    if (QFileInfo(it.filePath()).isFile()) {
        list << it.fileName();
    }
    it.next();
}
ui->textBrowser_filename->append(list.join('\n'));

如果这确实需要很长时间,就像您有数百或数千个文件一样,您可以运行在后台线程中创建字符串列表的代码段(使用QThreadPool, QRunnable,QtConcurrent等),然后完成,用大字符串更新文本浏览器。

于 2017-10-15T21:35:07.680 回答
0

问题是你处于一个紧密的循环中while(it.hasNext())

您可能可以使用 让它在每个循环上呈现QCoreApplication::processEvents,但取决于您添加到文本浏览器的文件数量,它可能会变得缓慢

QDirIterator it(dir, filters, QDir::NoDotAndDotDot | QDir::AllEntries , QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
    while(it.hasNext())
    {
        it.next();
        if(QFileInfo(it.filePath()).isFile())
        {
            QString name=it.fileName();
            ui->textBrowser_filename->append(name);

            QCoreApplication::processEvents(); // this will cause the filename to appear
        }
    }
于 2017-10-15T21:24:41.637 回答