为什么QTextBrowser中的文本不是逐个显示,而是一次全部显示
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
}
}
我同意史蒂夫回答的第一部分: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
等),完成后,使用大字符串更新文本浏览器。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 显示基于用户输入的整数的字符
- 应用程序最小化时单击显示桌面/最小化全部
- VS Intellisense显示了某些(不是全部)字节常数的逃脱字符
- 为什么QTextBrowser中的文本不是逐个显示,而是一次全部显示
- C 链接列表显示全部
- 在opencv中使用imwrite保存图像时,会将图像全部写入黑色,但imshow会正确显示
- 需要在qlist中存储多个矩形,并将它们全部显示在QPixmap上