2017-10-15 191 views
0

我使用的片段是如下爲什麼QTextBrowser中的文本不是一個接一個地顯示,而是一次顯示一次?

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的內容全在一次。發生了什麼問題?

+0

在追加後添加'qApp-> processEvents();'。 – eyllanesc

+0

上述方法的作用是強制GUI循環更新,各種任務(如偵聽信號,呼叫槽等)的GUI不要立即執行所有任務。另一種選擇是每一次迭代都由QTimer處理。 – eyllanesc

回答

0

問題是你處於一個嚴密的循環中(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 
     } 
    } 
+0

所以,有沒有其他的選擇呢,也就是說,可以通過使用其他小部件而不是textBrowser來提高性能(對不起,我是初學者,你可以告訴我小部件(如果有的話),我會閱讀文檔)。 –

+0

@secretsinside你只能調用processEvents每N個文件添加,作爲一個想法 –

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等),當完成時,用大字符串更新文本瀏覽器。

+0

但是,這個代碼並不是逐個顯示內容,我實際上已經問過,至於我讀取並運行上面的代碼,它正在列表中的文件名,最後通過用一個新行加入每個條目來追加。 –

+0

啊,我誤解了你的問題。是的,如果你想讓它逐一顯示,那麼唯一真正的選擇是使用Steve的答案,在添加每個項目後調用'processEvents()'。 – bnaecker