QML - Lesson 017. Export data into CSV format from data model in QML Qt


In that case, if you need to unload the table data from an application to a CSV file, the interface is more and is written in the QML, then hasten to this article, to give a little hint.

For example, in an article on work with SQLite database in the annex to the QML database was created, to which is added the data and removed from it. At the same time they appear in the TableView, which was already part of the interface written in QML. And to display the table used by the data model to inherit from QSqlQueryModel .

I propose to use the source code of the project and expand it so that there was a button in the application to export data to a CSV file.

What is a CSV format

CSV ( Comma-Separated Values ) — text format for presenting tabular data. Each line of the file - this is one line of the table. The values of individual columns are separated by a separating character (delimiter) - a comma (,). However, most of the programs is free treats CSV standard and allow the use of other characters as the delimiter.

In general, the essence of the work is reduced to ensure a method to our data model that will pull data from this model and a semicolon each cell in the row, and each row share a newline character "\ n".

Writing method to export the table to a CSV file

In the header file of our project to add a new method, respectively, for export and another method that will return the number of rows in the data model. Method to export the data as a slot declare it to be accessible from QML layer.

    int countRow();

public slots:
    void exportCSV();

Here I will make a reservation in the sense that what is needed is its own method, which returns the number of rows, if QSqlQueryModel, from whom we inherited has its own method, which returns the number of rows. The problem is that it does not work the way we want. If less than 256 rows, then everything is working properly, and if more, then it will still return a value of 256 or in some cases 512. In general, the real data do not wait. Therefore, the problem is solved SQL-queries to the database.

int ListModel::countRow()
    QSqlQuery query;
    query.prepare("SELECT COUNT(*) FROM " TABLE " ;");

    return query.value(0).toInt();

Now Let us examine a method to export data to a CSV file, which will take part above the resulted method of obtaining the number of rows in the table.

void ListModel::exportCSV()
    /* Create a CSV file of the object and specify the path to the file 
     * Be sure to include a valid path and extension .csv
     * */
    QFile csvFile("C:/example/excelExample.csv");

    // Open or create the file if it does not exist
    if(csvFile.open( QIODevice::WriteOnly ))
        // Create a text stream, which will write the data
        QTextStream textStream( &csvFile );
        QStringList stringList; // The helper object QSqtringList, which will form a line

        for( int row = 0; row < this->countRow(); row++ )
            stringList.clear(); // ... each time scraping tstringList
            /* If you pay attention to the header file, 
             * you can see in the listing the Roles, role model, that only 4
             * */
            for( int column = 0; column < 4; column++ )
                // Write in stringList each table entry
                stringList << this->data(this->index(row, column), Qt::UserRole + 1 + column).toString();
            /* Then send the entire file stringList by adding text flow dividers 
             * in the form of "" and putting at the end of a line terminator
             * */
            textStream << stringList.join( ';' )+"\n";
        // Close the file - ready


Well, in order that this case could start by adding rowLayout file main.qml button, by pressing which will start exporting data from a table to a CSV file.

// The code from the previous lesson  
    // Layer with TextField and Button to make entries in the database
    RowLayout {
        id: rowLayout
    // The code from the previous lesson 

        // to start exporting to Excel button
        Button {
            text: qsTr("Экспорт в Excel")

            // Start export
            onClicked: {


As a result, the updated application code from the last article will allow you to save the data from the table to a CSV file.


We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate


Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways


Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
May 26, 2020, 11:29 a.m.
Artem Sun-Dun-Chan

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
May 25, 2020, 11:33 a.m.
Mitja Nagibin

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
May 25, 2020, 5:05 a.m.

C++ - Test 001. The first program and data types

  • Result:66points,
  • Rating points-1
Last comments
May 29, 2020, 5:24 a.m.
Aleksandr Leonidov

Django - Tutorial 036. How to add authentication through social networks. VKontakte

Здравствуйте! После клика на ссылку авторизации выдает json словарь с ошибкой: {"error":"invalid_request","error_description":"redirect_uri is incorrect, check application redirect uri in …
May 28, 2020, 3:14 p.m.
Evgenij Legotskoj

Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column?

Ну в моём примере, который в статье сработало так model->setData(model->index(1, 1), 7); Поскольку model->index(1, 0) - это индекс колонки id, которая скрыта, поэтому…
May 28, 2020, 3:08 p.m.
Mihail A

Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column?

Спасибо, завтра првоерю. А model->setData(model->index(1, 0), 7); Тоже заработало?
May 28, 2020, 3:06 p.m.
Evgenij Legotskoj

Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column?

Да, метод data всё-таки влиял, я переписал его так и заработало удаление QVariant TableModel::data(const QModelIndex &idx, int role) const{ if (role == Qt::BackgroundColorRole) {…
May 28, 2020, 2:49 p.m.
Evgenij Legotskoj

Django - Tutorial 011. Adding comments to the site based on Django

Он более функциональный и его функционал объективно лучше поддерживается Django. Из первого, что приходит на ум: Это наличие полей типа Array Поддержка полей для JSON …
Now discuss on the forum
May 29, 2020, 1:55 a.m.
Igor' Poroshin

QTablwView + QSqlQueryModel скрыть пустой столбец

Да, понятно. В данном случае лучше использовать серверную процедуру (если такие поддерживаются), в которой будет проверяться наличие всех пустых строк у нужного столбца и вызываться соответ…
May 28, 2020, 6:21 p.m.
Rovshan Gurbanov

Сборка под старые версии Android

У меня SDK почти все версии есть, NDK есть версии 10, 17, 21. Но собирается приложение только с NDK v21 под Android версии 7.0 и выше Версия Qt у меня 5.14.2
May 28, 2020, 7:58 a.m.
Evgenij Legotskoj

Освобождение памяти QMainWindow::setCentralWidget

Да, соглашусь. Просто удаление происходит позже, а не сразу.
May 28, 2020, 5:43 a.m.

При подключении к git как указать пароль?

Нужно сделать ssh-keygen и потом полученый из файла код скопировать в ssh ключ в бикбакете
May 28, 2020, 1:42 a.m.


Да, проблема ушла, спасибо.
© EVILEG 2015-2020
Recommend hosting TIMEWEB