2017-06-02 237 views
0

我正在尝试将要显示的文本文件的内容传输到我的GUI中的textEdit小部件。Qt:在特定时间间隔内逐行读取文本文件

我该如何让它在文本上一次显示一行,而不是一次性显示文本文件的所有内容到textEdit小部件中?

通过使用“readLine”,它只能显示文本文件内容的第一行。如何让它显示内容的第二行后,比如说2秒?

这里是我的代码示例:

void ReadTextFile::on_pushButton_4_clicked() 
QFile textfile("my_file_here"); 
if (textfile.open(QIODevice::ReadOnly)||QIODevice::Text) { 
QTextStream in(&textfile); 
while (!in.atEnd()) { 
QString line = in.readLine(); 
ui->textEdit->append(line); 
} 
textfile.close(); 
qDebug() <<"Close Text File"; 
} 
qDebug() <<"Out Pushbutton File"; 
} 

我是一个新的家伙学习Qt编程,所以请温柔给我~~ ^^

+0

向我们展示使用'readLine'读取文件的代码。我想你在调用'readLine'之后关闭了流,因此每次执行代码时,它总是从第一行开始。相反,你不应该在达到'EOF'之前关闭流。 – putu

+0

void ReadTextFile :: on_pushButton_4_clicked() QFile textfile(“my_file_here”); (textfile.open(QIODevice :: ReadOnly)|| QIODevice :: Text) { QTextStream in(&textfile); (!in.atEnd()) QString line = in.readLine(); ui-> textEdit-> append(line); } textfile.close(); qDebug()<<“关闭文本文件”; } qDebug()<<“Out Pushbutton File”; } –

+0

对不起,我不知道如何使用插入编码像你的 –

回答

1

您可以使用计时器来触发连续行的读取。此功能是最好的分离成其自己的类,每次一个新行可发出信号:

// 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 &); 
}; 

因为我们使用了一个QPlainTextEdit显示的文本,我们需要的原料线转换成字符串。

QString lineToString(QByteArray line) { 
    while (line.endsWith('\n') || line.endsWith('\r')) 
     line.chop(1); 
    return QString::fromUtf8(line); 
} 

它现在是一个简单的事情,把它连成一个演示:

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" 

这结束了完整的例子,因为QPlainTextEdit::appendPlainText已经增加了一个段落的结束,我们必须删除任何行结尾。

+0

谢谢,先生!我已经运行该程序并运行良好。 但是对于我来说,代码有点难以理解,特别是在main.cpp文件的第16,17,33行和从第47行到第56行。但感谢您的帮助! ^^ –

+0

这是2017年,所以我们应该使用现代C++ 11。似乎你没有跟上它。 ** 16 **'{}'提供了一个默认构造的值,而指针与'nullptr'相同。在过去,你会写'0'或'NULL'。 ** 17 **这是现代连接语法。参见Qt文档。 ** 33 **我们从UTF8表示中创建一个字符串。一个文件本身没有意义,所以我们将一串字节转换为一个字符串。 ** 47-56 **我们将点击的信号连接到一个lambda - 一个延续对象,它捕获对周围环境的引用。兰巴达斯带回帕斯卡尔地方功能,并增压他们:) –

+0

谢谢,@ KubaOber。 我想知道是否可以根据文本文件的顺序将逐行读取的文本行作为输入插入到Arduino中? –

1

您必须创建一个QTimer运行的任务每2秒钟一次。要处理文本,您可以创建一个QStringList,其中每行添加readLine()atEnd函数将指示文件中存在偶数据。

QStringList texts; 

QTimer *timer = new QTimer(this); 

connect(timer, &QTimer::timeout, [=](){ 
    if(!texts.isEmpty()){ 
     your_textEdit->append(texts.first()); 
     texts.pop_front(); 
    } 
    else 
     timer->stop(); 
}); 

QString fileName = "path_of_your_file" 
QFile file(fileName); 
if(file.open(QIODevice::ReadOnly)) { 
    QTextStream in(&file); 
    while (!in.atEnd()) { 
     texts.append(in.readLine()); 
    } 
    timer->start(2000); 
} 
file.close(); 

完整的代码是here

+0

谢谢@ eyllanesc,我已经试过你的代码,但是当我试图运行该程序就说明 错误“过客‘常量QStringList中’为‘本’的说法丢弃预选赛[-fpermissive]” 在行 “texts.pop_front();” 我在哪里做错了? –

+0

我已经通过链接到整个项目,运行它,并告诉我你得到什么,请。 – eyllanesc

+0

我有一些用户界面文件的问题。当我双击Qt创建者内部的ui文件来访问它时,会显示一个对话框。 “ ”在读取第35行第98列的UI文件时发生了错误:预期'=',但得到了'>'。“ –