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!