【发布时间】: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->textEdit->append(data); -
什么是
this?它也是TestReader吗?TestReader::testData发射在哪里?databaseData连接到什么了吗? -
它应该发出
testData(data);(已编辑),this是TestWindow类(GUI)窗口。我也可以这样连接:connect(reader, &DatabaseReader::databaseData, ui->textEdit, &QTextEdit::append);。但是窗口仍然没有响应。 -
我认为
QTextEdit无法处理很多行,这就是窗口没有响应的原因。
标签: c++ qt qtextedit qtextstream