[C++] Csv-String aus QTableView erzeugen

B

Bgag

Guten Abend!

Ich habe gerade ein kleines Problem. Ich arbeite schon seit längerem mit QT, habe jedoch noch nie wirklich eine grafische Oberfläche implementiert. Irgendwann ist immer das erste mal und so ärgere ich mich gerade mit der QTableView herum.

Ich möchte eigentlich nur einzelne Zellen der Tabelle auslesen können, um so einen CSV-String erzeugen zu können. Den betreffenden Code findet ihr am Ende dieses Posts. Die Klasse Spreadsheet, die diese Methode implementiert, erbt ihrerseits von der Klasse QTableView. Später sollen in ihr Daten aus einer Sql-Abfrage abgelegt und dargstellet werden. Die Methode void Spreadsheet::toCsv() soll dann einen Export nach Excel ermöglichen.

Wäre super, wenn mir jemand sagen könnte, was ich beim Durchlaufen der Zeilen und Spalten, bzw. der Ansprache der einzelnen Zellen falsch machen.

Liebe Grüße,

Andreas

C++:
void Spreadsheet::toCsv() {
    QTextStream out(stdout);

    // Define some constants needed, ...
    const char delimeter = ',';
    const char escape = '"';
    const char newline = '\n';

    // ... the result string.
    QString result = "";

    // Loop over all rows, ...
    for(int i = 0; i < this->model()->rowCount(); ++i) {
        // ... init array to hold the cell strings ...
        QStringList* line = new QStringList;

        // ... and loop over all columns.
        for(int j = 0; i < this->model()->columnCount(); ++j) {
            // Fetch the current cell.
//            QString cell = this->model()->data(this->model()->index(j,i)).toString();
            QModelIndex index = this->indexAt(QPoint(i,j));
            QString cell = this->model()->data( index ).toString();

            // Escape escape sequences.
            if( cell.contains(escape) ) {
                cell.replace(escape, QString(escape) + escape);
            }

            // Pre- and append escapes ...
            cell.prepend(escape);
            cell.append(escape);

            // ... and append cell to result string.
            line->append(cell);

            out << cell + "\n";
        }

        // Seperate all cells, append the line ...
        result.append(line->join(QString(delimeter)));

        // ... and a linebreak to the result string.
        result.append(QString(newline));

        out << line->join(QString(delimeter)) + "\n";
    }

    out << result;
}
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

ich glaube dein Zugriff auf das Modell ist so nicht korrekt:

model()->indexAt(QPoint(...));

ich mache das immer mit model()->index(int col, int row) oder andersrum. Mal in der Doku lesen. Das klappt bei mir. Ist nur ein Ansatz.
 
Guten Morgen!

Erstmal vielen Dank für deine Antwort. Leider kann ich es gerade nicht testen, aber es scheint mir, als wäre das Abfragen der Daten abhängig vom verwendeten Model. Kann das sein?

Zudem würde mich interessieren, ob es möglich ist diese Funktion zu nutzen um so einen Drag 'n Drop Mechanismus zu entwickeln, der es dem Anwender erlaubt markierte Zellen aus meinem Program in Excel, OpenCalc oder Gnumeric zu ziehen.

Liebe Grüße,

Andreas
 
Zuletzt bearbeitet von einem Moderator:
Zurück