2017-06-02 2 views
0

表示するテキストファイルの内容をGUIのテキストエディットウィジェットに転送しようとしています。Qt:特定の時間間隔でテキストファイルを1行ずつ読み込みます。

テキストエディットウィジェットにテキストファイルのすべての内容を一度に表示するのではなく、一度に1行ずつテキストを編集する方法を教えてください。

"readLine"を使うと、テキストファイルの内容の最初の行だけを表示できます。どのようにすれば2秒後にコンテンツの2行目を表示させることができますか?私は、そう私に優しくしてくださいQtのプログラミングを学ぶ新しい男だ

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"; 
} 

~~ ^^あなたは、タスクを実行するためのQTimerを作成する必要があります

+0

'readLine'を使用してファイルを読み取るコードを表示します。 'readLine'を呼び出した後にストリームを閉じると、コードが実行されるたびに常に最初の行から開始されます。代わりに、 'EOF'に達する前にストリームを閉じるべきではありません。 – putu

+0

void ReadTextFile :: on_pushButton_4_clicked() QFile textfile( "my_file_here"); if(textfile.open(QIODevice :: ReadOnly)|| QIODevice :: Text) { QTextStream in(&textfile); while(!inEnd()) { QString line = in.readLine(); ui-> textEdit-> append(行); } textfile.close(); qDebug()<< "テキストファイルを閉じる"; } qDebug()<< "プッシュボタンファイル"; } –

+0

申し訳ありませんあなたのようなコードを挿入する方法を知っていません –

答えて

1

タイマーを使用して、連続する行の読み取りをトリガすることができます。我々はテキストを表示するQPlainTextEditを使用しているので、私たちは、文字列の中に生の行を変換する必要があり

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

:この機能は、最高のたびに新しいラインが利用可能である信号を発する独自のクラスに分かれています。

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

ありがとうございました!私はプログラムを実行し、うまく動作します。私はライン16,17,33時および47からmain.cppにファイルの56に特に理解する しかしコードが少し難しいです。しかし、助けてくれてありがとう! ^^ –

+0

それは2017なので、現代のC++ 11を使うべきです。あなたはそれに追いついていないようだ。 ** 16 ** '{}'はデフォルトで構築された値を提供し、ポインタは 'nullptr'と同じです。昔は '0'か' NULL'を書いていました。 ** 17 **これは最新の接続構文です。 Qtのドキュメントを参照してください。 ** 33 ** UTF8表現から文字列を作成します。ファイル自体は意味を持ちませんので、バイトストリームを文字列に変換します。 ** 47-56 **クリックされた信号をラムダに接続します。これは、周囲のコンテキストへの参照を取得する継続オブジェクトです。ラムダは、パスカル地元の機能を取り戻す、およびそれらを過給:) –

+0

は、@KubaOberをありがとうございました。 テキストファイルからのシーケンスに従って、行単位で読み込まれるテキスト行を入力としてArduinoに挿入できるかどうか疑問に思っていましたか? –

1

:ここ

は、私のコードのサンプルです2秒ごとに。テキストを処理するにはを作成し、各行に 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 @ありがとう、私はあなたのコードを試してみましたが、私はプログラムを実行しようとしたとき、それはラインで の誤差は「『この』引数は、修飾子[-fpermissive]を破棄として 『constのQStringList』を渡すこと」を示し "texts.pop_front();" 私が間違っていたんでした ? –

+0

私はプロジェクト全体にリンクを渡し、実行して何を得るか教えてください。 – eyllanesc

+0

私はUIファイルに何か問題があります。 Qt作成者の中のuiファイルをダブルクリックしてアクセスすると、ダイアログボックスが表示されました。 "35行目、98列目のUIファイルを読み込んでいるときにエラーが発生しました: '='、しかし '>'があります" –

関連する問題