【问题标题】:QTextEdit append issueQTextEdit附加问题
【发布时间】:2017-03-19 12:17:59
【问题描述】:

我想从文件中读取一些文本并显示在QTextEdit 中。文件大约 2 MB。我创建了QObject 类并使用线程连接信号和插槽。问题是即使线程正在运行,它仍然会冻结窗口。

我的代码:

QObject 类:

void TestReader::readTestFile()
{
    QFile dbFile;
    QTextStream dbTextStream;
    dbFile.setFileName(":Test/Test.txt");
    dbFile.open(QFile::ReadOnly);
    dbTextStream.setDevice(&dbFile);
    QString data;

    while (!dbTextStream.atEnd()) {
        data = dbTextStream.readLine();
        emit testData(data);
    }

    emit finished();
}

GUI 窗口:

readerThread = new QThread();
reader = new TestReader();
reader->moveToThread(readerThread);
connect(readerThread, &QThread::started, reader, &TestReader::readTestFile);
connect(reader, &TestReader::testData, this, &TestWindow::loadTestData);
connect(reader, &TestReader::finished, readerThread, &QThread::quit, Qt::DirectConnection);
readerThread->start();

如何解决? 提前感谢您的帮助。

更新: 我决定使用QtConcurrent

代码:

dbFile.setFileName(":Test/Test.txt");
dbFile.open(QIODevice::ReadOnly);
dbTextStream.setDevice(&dbFile);
dbTextStream.setCodec("windows-1251");
QFuture<QString> myData = QtConcurrent::run(this, &TestWindow::loadTestData);
ui->plainTextEdit->appendPlainText(myData.result());

QString TestWindow::loadTestData()
{
  QString data = dbTextStream.readAll();
  return data;
}

没有错误,没有警告,但它会阻塞窗口(GUI)几秒钟。

【问题讨论】:

  • 在第二次调用connect() 时,为什么要将reader 连接到this
  • 我连接到函数 loadTestData 并在其中添加文本:ui-&gt;textEdit-&gt;append(data);
  • 什么是this?它也是TestReader 吗? TestReader::testData 发射在哪里? databaseData连接到什么了吗?
  • 它应该发出testData(data);(已编辑),thisTestWindow 类(GUI)窗口。我也可以这样连接:connect(reader, &amp;DatabaseReader::databaseData, ui-&gt;textEdit, &amp;QTextEdit::append);。但是窗口仍然没有响应。
  • 我认为QTextEdit 无法处理很多行,这就是窗口没有响应的原因。

标签: c++ qt qtextedit qtextstream


【解决方案1】:

使用QPlainTextEdit。来自 QT 文档:

QPlainTextEdit 是一个支持纯文本的高级查看器/编辑器。它针对处理大型文档和快速响应用户输入进行了优化。

希望这会对你有所帮助。

【讨论】:

  • 谢谢,但窗口仍然没有响应。
  • 说实话,我真的不知道 Qt 是否还有其他更复杂的方法来显示大量文本。我猜你有一个覆盖一些文本编辑小部件并实现某种缓存逻辑。可能您应该只显示当前需要的内容,如果用户滚动,例如,您重新加载您的小部件并显示更多文本。
  • 我认为另一种选择是实现QtConcurrent::run
猜你喜欢
  • 2016-02-03
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多