Loading ...

Riempire una QTableWidget da file CSV

Riempire una QTableWidget da file CSV

La mia esigenza era quella di riempire una QTableWidget usando un file CSV.

Postare tutto il codice è un pò complicato, quindi vi posterò solo ciò che serve.

Nel nostro file di intestazione avremmo una cosa del genere:

public:
    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);

Dobbiamo anche inludere la libreria QMimeData.

Nel file di implementazione:

MyWindow::PrioritaWindow(BaseWindow *parent) {
    this->setAcceptDrops(true);
}

void MyWindow::dragEnterEvent(QDragEnterEvent *event) {
    if (event->mimeData()->hasUrls()) {
        event->acceptProposedAction();
    }
}

void MyWindow::dropEvent(QDropEvent *event) {
    if (event->mimeData()->hasUrls()) {
        QUrl url(event->mimeData()->urls()[0]);
        QFileInfo f(url.toLocalFile());
        QFile file(url.toLocalFile());
        if (f.exists() && f.isFile() 
                && f.fileName().toLower().endsWith(".csv") 
                && file.open(QIODevice::ReadOnly)) {
            int rows = 0;
            while (!file.atEnd()) {
                QByteArray line = file.readLine();
                QString first(line.split(',').first().trimmed());
                QString last(line.split(',').last().trimmed());
                ui->baseTable->insertRow(ui->baseTable->rowCount());
                ui->baseTable->setItem(rows, 0, new QTableWidgetItem(first));
                ui->baseTable->setItem(rows, 1, new QTableWidgetItem(last));
                rows++;
            }
        } else {
            qDebug() << "Non è un file CSV";
        }
    }
}

In sostanza:

  • nel costruttore impostiamo di accettare drop sulla finestra
  • nel dragEnterEvent impostiamo di accettare l'evento che viene "proposto"
  • nel dropEvent facciamo un pò di controlli (se quello trascinato è un file, se ha l'estensione csv, se è possibile aprirlo)
  • in caso di controlli positivi riempiamo la QTableWidget

Ovviamente dovete adattarlo alle vostre esigenze; nel mio caso la tabella ha due colonne, e il file CSV anche.

Ma potreste aggiungere le colonne in maniera dinamica.

Enjoy!