2016-04-15 21 views
0

QTableWidget(私のコードでは、ipTable)itemはtest_data.txtから来ています。 しかし、test_data.txtファイルは3秒ごとに変化します。 テーブルを自動的にリフレッシュしたいです。QTableWidgetを自動的にリフレッシュできますか?

QTableWidgetを自動的に更新するにはどうしたらいいですか?

これは私のコードです。

#include "dialog.h" 
#include "ui_dialog.h" 
#include "addip.h" 

#include <QFile> 

Dialog::Dialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::Dialog) 
{ 
    ui->setupUi(this); 

    timer = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), this, SLOT(onTimer())); 
    timer->start(1000); 

    setWindowTitle("IP List"); 

    ui->ipTable->setColumnCount(3); 

    refresh_table(); 
} 

Dialog::~Dialog() 
{ 
    delete ui; 
} 


QStringList Dialog::refresh_table() 
{ 
    int field; 
    QFile file("/home/yein/widget/test_data.txt"); 

    QStringList title; 
    title << "IP" << "Protocol" << "state"; 

    file.open(QIODevice::ReadOnly); 
    QTextStream read(&file); 

    ui->ipTable->clear(); 
    ui->ipTable->setRowCount(0); 
    ui->ipTable->setHorizontalHeaderLabels(title); 

    while(!read.atEnd()) 
    { 
     QString tmp = read.readLine(); 
     QStringList tmpList = tmp.split(","); 

     ui->ipTable->insertRow(ui->ipTable->rowCount()); 
     field = ui->ipTable->rowCount() - 1; 

     ui->ipTable->setItem(field, IP, new QTableWidgetItem(tmpList[0])); 
     ui->ipTable->setItem(field, PROTOCOL, new QTableWidgetItem(tmpList[1])); 
     ui->ipTable->setItem(field, STATE, new QTableWidgetItem(tmpList[2])); 
    } 
    file.close(); 

    return table; 
} 

void Dialog::on_btnAdd_clicked() 
{ 
    QString protocol; 
    QString IP; 
    int res; 
    addIP add(this); 
    add.setWindowTitle("Add IP"); 
    res = add.exec(); 

    if(res == QDialog::Rejected) 
     return; 

    IP = add.getIP(); 
    protocol = add.getProtocol(); 

    qDebug() << "IP :" << " " << IP; 
    qDebug() << "Protocol : " << " " << protocol; 

    write_on_file(IP,protocol); 

} 

void Dialog::write_on_file(QString IP, QString protocol) 
{ 
    QFile file("/home/yein/widget/test_data.txt"); 

    file.open(QIODevice::Append); 

    data[0] = IP; 
    data[1] = protocol; 
    data[2] = "0";  // init state 0 

    QString _str = QString("%1,%2,%3\n") 
      .arg(data[0]) 
      .arg(data[1]) 
      .arg(data[2]); 

    qDebug() << _str << " "; 

    QByteArray str; 
    str.append(_str); 

    file.write(str); 

    file.close(); 

    refresh_table(); 
} 


void Dialog::on_btnClose_clicked() 
{ 
    this->close(); 
} 

void Dialog::onTimer() 
{ 
    updateRStatusBar(); 
} 

void Dialog::updateRStatusBar() 
{ 
    QDateTime local(QDateTime::currentDateTime()); 

    ui->clock->setText(local.toString()); 
} 

答えて

1

1つのオプションは、

QFileSystemWatcher::fileChanged(const QString &path) 

を使用すると、ファイルが変更されるたびに、信号を受信することです。この推奨事項は、ファイルの変更頻度と表示するファイルの数によって異なります。

+0

ありがとうございました! –

+0

私はこのコードをDialog :: Dialog(QWidget * parent)に追加します: これは動作しますが一度働く..間違っていますか? 'ウォッチャー=新しいQFileSystemWatcher(これ);connect(ウォッチャー、SIGNAL(fileChanged(const QString&))、this、SLOT(refresh_table())); watcher-> addPath( "/ home/yein/widget/test_data.txt"); ' –

+0

これは初回のみ動作しますか?あなたのコードは私にはかなり良く見えます。ファイルを変更していますか?または、それを削除してどこかで再作成しますか? – Paraboloid87