2016-04-15 18 views
0

QTableWidget (in meinem Code, ipTable) Item kommen aus test_data.txt. Die Datei test_data.txt ändert sich jedoch alle 3 Sekunden. Ich möchte die Tabelle automatisch aktualisieren ..QTableWidget automatisch aktualisieren?

Wie kann ich QTableWidget automatisch aktualisieren ..?

Dies ist mein Code.

#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()); 
} 

Antwort

1

Eine Option ist

QFileSystemWatcher::fileChanged(const QString &path) 

und erhalten ein Signal zu verwenden, wann immer die Datei geändert wird. Diese Empfehlung hängt davon ab, wie oft die Datei geändert wird und wie viele Dateien Sie sehen möchten.

+0

Vielen Dank für die Antwort! –

+0

Ich füge diesen Code in Dialog :: Dialog (QWidget * Eltern): Es funktioniert, aber Arbeit einmal .. mache ich falsch? 'Watcher = neuer QFileSystemWatcher (this); connect (Watcher, SIGNAL (fileChanged (const QString &)), dies, SLOT (refresh_table())); Watcher-> addPath ("/ home/yein/widget/test_data.txt"); ' –

+0

Es funktioniert nur das erste Mal? Dein Code sieht für mich ziemlich gut aus. Änderst du die Datei? Oder löschst du es und erstellst es irgendwo neu? – Paraboloid87

Verwandte Themen