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!
c++ qt qtablewidget qmimedata dragenterevent dropevent csv
Commentami!