Sie können einen Timer verwenden, um das Lesen aufeinanderfolgender Zeilen auszulösen. Diese Funktionalität wird am besten in seine eigene Klasse getrennt, die ein Signal jedesmal, wenn eine neue Zeile emittiert verfügbar:
// https://github.com/KubaO/stackoverflown/tree/master/questions/timed-read-44319722
#include <QtWidgets>
class PeriodicReader : public QObject {
Q_OBJECT
QTimer m_timer{this};
QFile m_file{this};
void readLine() {
if (m_file.atEnd()) {
m_timer.stop();
return;
}
emit newLine(m_file.readLine());
}
public:
explicit PeriodicReader(QObject * parent = {}) : QObject(parent) {
connect(&m_timer, &QTimer::timeout, this, &PeriodicReader::readLine);
}
void load(const QString & fileName) {
m_file.close(); // allow re-opening of the file
m_file.setFileName(fileName);
if (m_file.open(QFile::ReadOnly | QFile::Text)) {
readLine();
m_timer.start(300); // 0.3s interval
}
}
Q_SIGNAL void newLine(const QByteArray &);
};
Da wir eine QPlainTextEdit
verwenden um den Text anzuzeigen, müssen wir die Rohzeilen in Strings konvertieren. Wir müssen alle Zeilenenden entfernen, da QPlainTextEdit::appendPlainText
bereits einen Absatz Ende fügt hinzu:
QString lineToString(QByteArray line) {
while (line.endsWith('\n') || line.endsWith('\r'))
line.chop(1);
return QString::fromUtf8(line);
}
Es ist jetzt eine einfache Sache, um es zusammen in eine Demo:
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QWidget window;
QVBoxLayout layout{&window};
QPushButton load{"Load"};
QPlainTextEdit edit;
layout.addWidget(&load);
layout.addWidget(&edit);
window.show();
PeriodicReader reader;
QObject::connect(&load, &QPushButton::clicked, [&]{
auto name = QFileDialog::getOpenFileName(&window);
if (!name.isEmpty()) {
edit.clear(); // allow re-opening of the file
reader.load(name);
}
});
QObject::connect(&reader, &PeriodicReader::newLine, &edit,
[&](const QByteArray & line){ edit.appendPlainText(lineToString(line)); });
return app.exec();
}
#include "main.moc"
Dies schließt die vollständige Beispiel.
Zeigen Sie uns den Code, der die Datei mit 'readLine' liest. Ich denke, Sie schließen den Stream nach dem Aufruf von 'readLine', also jedes Mal, wenn dieser Code ausgeführt wird, beginnt er immer in der ersten Zeile. Stattdessen sollten Sie den Stream nicht schließen, bevor Sie 'EOF' erreichen. – putu
void ReadTextFile :: on_pushButton_4_clicked() QFile Textdatei ("my_file_here"); if (textdatei.open (QIODevice :: ReadOnly) || QIODevice :: Text) { QTextStream in (& textfile); während (! In.atEnd()) { QString line = in.readLine(); ui-> TextEdit-> Anhängen (Linie); } textdatei.close(); qDebug() << "Textdatei schließen"; } qDebug() << "Drucktaste Datei"; } –
Entschuldigung, ich weiß nicht, wie Insert-Codierung wie Sie verwenden –