[英]Why text inside QTextBrowser is not displayed one-by-one instead it displays all-at-once?
我使用的代码段如下
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的内容。 怎么了
问题是您处在紧密循环中( while(it.hasNext())
),Qt将无法呈现您要求的任何内容,直到退出该循环并控制UI线程返回为止到Qt事件循环。
您可能可以使用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
}
}
我同意Steve回答的第一部分:GUI的更新非常昂贵,并且仅在控件返回到Qt主应用程序事件循环时才发生。
但是,与其建议在循环内手动调用processEvents()
(通常应避免这样做),我建议通过加入要添加的所有文件名来构造单个字符串,然后仅对QTextBrowser::append()
进行单个调用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
等),以及何时完成后,使用大字符串更新文本浏览器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.