为啥我的qt程序卡住了?

Posted

技术标签:

【中文标题】为啥我的qt程序卡住了?【英文标题】:why my qt program get stuck?为什么我的qt程序卡住了? 【发布时间】:2017-10-05 19:45:41 【问题描述】:

我正在打印 textBrowser_filename 中的文件名。但是在 commenting 中,在 textBrowser 中打印文件名的 sn-p 运行平稳。那么 Qtcreator 的 textBrowser 中是否有可以打印/存储的文本上限? 以下是运行顺利的代码,但如果注释被删除,则无法运行。

void MainWindow::on_pushButton_browse_clicked()

    ui->textBrowser_filename->setLineWrapMode(QTextEdit::NoWrap);
    ui->textBrowser_filename->setText("");
    QString dir= QFileDialog::getExistingDirectory(this, tr("Open Directory"),
                                                   "/home",
                                                   QFileDialog::ShowDirsOnly
                                                   | QFileDialog::DontResolveSymlinks);
    ui->lineEdit_dir->setText(dir);
    QDirIterator it(dir, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
    /*
    while(it.hasNext())
    
        QString path=it.fileName();
        ui->textBrowser_filename->append(path);
        it.next();
    
    */

如果您能帮我解决另一个问题,那就太好了, 为什么我的文件名还打印以下内容(已注释)?

sample.txt
.          //why this is printed
helloWorld.png
..         //why this is printed

谢谢!

【问题讨论】:

隐藏点文件要使用QDir::NoDotAndDotDot filter doc.qt.io/qt-5/qdiriterator.html#QDirIterator-2 不幸的是,在应用 QDir::NoDotAndDotDot 过滤器后没有打印任何内容。:( 我像QDirIterator it(dir, QDir::NoDotAndDotDot , QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);一样添加了它//根据定义非常正确 使用QDirIterator it(dir, QDir::NoDotAndDotDot | QDir::AllEntries , QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);解决 【参考方案1】:

关于第二个问题,为什么要打印...。那是因为它们是当前目录中的文件。它们分别对应于当前目录和父目录。如果你想使用QDir::NoDotAndDotDotQDir::setFilter(),你可以忽略它们。但它们存在并且QDirIterator 将遍历它们,除非您另外指定。

至于您的主要问题,为什么QTextBrowser 没有“顺利”运行。我不知道你到底是什么意思。慢吗?它真的有效吗?你的目录有多少个文件?

如果速度很慢,您可以尝试将所有文​​件名字符串合并为一个,然后使用合并的字符串调用QTextBrowser::append()。例如:

dir.setFilter(QDir::NoDotAndDotDot); // ignore . and ..
QDirIterator it(dir, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
QStringList files;
while (it.hasNext()) 
    files << it.fileName();
    it = it.next();

ui->textBrowser_filename.append(files.join('\n'));

【讨论】:

这也是我的建议。我怀疑每次添加文本时,整个文本浏览器都必须重新计算其内部状态。但是你看不到任何事情发生,因为没有调用主事件循环,所以直到最后才显示 UI 更新。 “顺利”是指没有任何控制台错误,它运行良好。 但是如果评论被删除而不是卡住并且控制台错误说程序以退出状态 1 结束。如果我的话误导了你,它不是“慢” 好吧,您在原始帖子中从未提到过!我建议您使用调试器逐步完成,或者在向浏览器添加新行时打印出qDebug() 消息。您确定错误是因为注释掉的代码而发生的吗? 不,我只是猜到了,因为当我评论那部分时,它顺利工作了:)

以上是关于为啥我的qt程序卡住了?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 64 位 5s iPhone 上安装时应用程序会卡住

为啥在部署我的项目后卡住/空白页面?反应路由器 Dom |参数

为啥 GUI 卡住并且后台进程运行良好?

为啥我在 Azkaban 中的 Sqoop 任务在选择列后卡住了?

创建嵌入式 R 实例时执行卡住

我的 iPhone 应用程序卡住了