July 25, 2019, 4:31 p.m.

QML Model & C++Model

qml, qt, model

Доброго времни суток! есть модель на C++,которая берет данные из sqlite базы. в файле QML есть listview, в который должны загружаться данные, с листом очень много действий и в такой ситуации не удобно работать с С++ моделью, поскольку нужно регулярно делать апдейт модели данные в делегатах перезатираются что сильно затрудняет работу, а из самой модели данные нужны только на старте. Собственно вопрос, можно ли при старте програмы С++ модель копировать в QML модель чтоб с ней работать динамично, чтоб только в некоторых ситуациях данные записывались в базу и отобразились только при следующем старте программы.
п.с если не понятно описание задавайте вопросы

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.
4

Добрый день!

А можно код того, как модель C++ регистрируется в QML и как она добавлена в ListView?

main.cpp

 PageModel *page_model=new PageModel();
     engine.rootContext()->setContextProperty("page_model",page_model);

Pagemodel.h

class PageModel : public QSqlQueryModel
{
    Q_OBJECT
public:
    explicit PageModel(QObject *parent = nullptr);

    enum Roles
    {
        idRole= Qt::UserRole+1,
        urlRole,
        nameSiteRole,
        screenRole
    };

    Q_INVOKABLE QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
    Q_INVOKABLE QVariantMap get(int idx) const;

signals:

protected:
    QHash<int,QByteArray> roleNames()const;

public slots:
    void updateModel();
    int getId(int row);
};

PageModel.cpp

PageModel::PageModel(QObject *parent) : QSqlQueryModel (parent)
{
    this->updateModel();
}

QVariant PageModel::data(const QModelIndex &index, int role) const
{
    int columnId = role - Qt::UserRole - 1;
    // Создаём индекс с помощью новоиспечённого ID колонки
    QModelIndex modelIndex = this->index(index.row(), columnId);

    /* И с помощью уже метода data() базового класса
     * вытаскиваем данные для таблицы из модели
     * */
    return QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
}

QVariantMap PageModel::get(int idx) const
{
    QVariantMap map;
    foreach(int k, roleNames().keys()) {
        map[roleNames().value(k)] = data(index(idx, 0), k);
    }
    return map;
}

QHash<int, QByteArray> PageModel::roleNames() const
{
    QHash<int, QByteArray> roles;
    roles[idRole]="id";
    roles[urlRole]="url";
    roles[nameSiteRole]="namesite";
    roles[screenRole]="screen";
    return roles;
}

void PageModel::updateModel()
{
    this->setQuery("select id, url, namesite, screen from openTabTable");
}

int PageModel::getId(int row)
{
    return this->data(this->index(row, 0), idRole).toInt();
}

QML

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtWebView 1.13

Item {
    id: idListView1Form
    width: 400
    height: 700

    Rectangle{
        id: rectangleForListView
        y: parent.height * 0.15
        height: parent.height * 0.7
        anchors.left: parent.left
        anchors.right: parent.right

        ListView
        {
            id: myListView1
            highlightRangeMode: ListView.StrictlyEnforceRange
            anchors.fill: parent
            orientation : ListView.Horizontal
            snapMode: ListView.NoSnap
            contentX: 100
            contentWidth: 100
            model: page_model

            delegate:ItemDelegate
            {
                id: itemDelegate
                width : myListView1.width < myListView1.height ? myListView1.width * 0.7 : myListView1.height * 1
                height: myListView1.width < myListView1.height ? myListView1.width * 1 : myListView1.height * 0.7
                Rectangle
                {

                    WebView1
                    {
                        id:webView
                    }

                    anchors.fill: parent
                    anchors.leftMargin: myListView1.width * 0.06
                    Label
                    {
                        id:site_name
                        anchors.top: parent.top
                        anchors.centerIn: parent
                        text: namesite
                    }

                    Rectangle {
                        id: rec1
                        color: "grey"
                        anchors
                        {
                            top:site_name.bottom
                            left: parent.left
                            right:parent.right
                            bottom:parent.bottom
                        }
                        Label
                        {
                            anchors.centerIn: parent
                            text: url
                        }
                    }


                }
                MouseArea
                {
                    id: ma_click
                    anchors.fill: parent
                    onClicked:
                    {
                        webView.url=url
                        stack.push(webView)
                    }
                }
            }
        }
    }
}

Я не уверен, но думаю. что можно ещё переписать метод setData в QSqlQueryModel, в котором записывать данные в базу данных и сразу делать апдейт модели после записи данных в базу данных. Тогда проблема с перезатиранием данных в делегатах будет уже менее актуальна.

Также, как вы и сказали, что данные нужны только при старте, то я бы попробовал написать обычную модель данных. в функции main, забирал бы данные из базы данных в вектор, которые бы устанавливал в ту модель. Тогда уже данные не будут так зависимы от базы данных, как было поначалу.

Ещё можно попробовать с помощью QVariantMap протолкнуть данные до QML и там уже записать в QML модель данных.

Ещё можно попробовать взять данные из базы данных прямо в QML

import QtQuick 2.0

Rectangle {
    color: "white"
    width: 200
    height: 100

    Text {
        text: "?"
        anchors.horizontalCenter: parent.horizontalCenter
        function findGreetings() {
            var db = openDatabaseSync("QDeclarativeExampleDB", "1.0", "The Example QML SQL!", 1000000);

            db.transaction(
                function(tx) {
                    // Create the database if it doesn't already exist
                    tx.executeSql('CREATE TABLE IF NOT EXISTS Greeting(salutation TEXT, salutee TEXT)');

                    // Add (another) greeting row
                    tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]);

                    // Show all added greetings
                    var rs = tx.executeSql('SELECT * FROM Greeting');

                    var r = ""
                    for (var i = 0; i < rs.rows.length; i++) {
                        r += rs.rows.item(i).salutation + ", " + rs.rows.item(i).salutee + "\n"
                    }
                    text = r
                }
            )
        }
        Component.onCompleted: findGreetings()
    }
}

Тогда манипуляций в C++ делать не нужно будет.

благодарю, интересное решение

Comments

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
Donate

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

PayPalYandex.Money
Timeweb

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
June 5, 2020, 11:20 p.m.
Aleksej

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

  • Result:60points,
  • Rating points-1
June 5, 2020, 11:15 p.m.
Aleksej

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

  • Result:53points,
  • Rating points-4
V
June 5, 2020, 4:47 p.m.
Vladzo

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
Last comments
June 6, 2020, 3:13 p.m.
Vladislav Melenchuk

How to install and setting up Django JET

Можно использовать six и оттуда импортировать unicode. Я так решил проблему) Но всё равно откатился обратно на админку джанги.
June 6, 2020, 11:20 a.m.
BL4CK R4BBIT

How to install and setting up Django JET

на Django >3+ работать не будет. Либо придется лезть внутрь и переопределять метод unicode . Либо писать декоратор
June 5, 2020, 10:52 a.m.
progammist

Распознавание изображений на Python с помощью TensorFlow и Keras

Огромное спасибо за метериал, по-больше бы подобных статей (с подробным описанием работы и примерами применения) на тему современных технологий. Вопрос поразмышлять. На текущий момент реал…
June 5, 2020, 1:39 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

По-моему, смысла в этом нет особого. Если делегат будет игнорировать настройки таблицы, то это приведёт ещё к большему непониманию, что вообще происходит, для программиста, который после вас буд…
June 5, 2020, 1:34 a.m.
IscanderChe

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Сижу, размышляю: можно ли переписать делегата так, чтобы независимо от настроек строк выделялись строки?
Now discuss on the forum
u
June 6, 2020, 7:26 a.m.
ubomj

Галерея изображений

delete
s
June 6, 2020, 1:54 a.m.
shuric

Qt/C++ Определение положения курсора над действие(кнопкой) в QToolBar

Доброго дня. Возник вопрос - как можно определить что курсор находится над определенным действием(кнопкой) в qtoolbar ? mainwindow.cpp MainWindow::MainWi…
s
June 6, 2020, 12:45 a.m.
shuric

Qt/C++ особенности QProxyStyle

Да, Вы правы. Код был скопирован с сайта (уже не помню с какого), но решил пойти по пути более легком. Пришлось переписать - кому интересно: использовал stackedWidget для пе…
June 5, 2020, 11:08 p.m.
Aleksej

Посоветуйте новичку (базы данных и Qt, что учить)

Блин, а я недавно купил Шлее Qt 5.10 :( С детства хотел стать программистом, баловался Паскалем, писал простенькие программки на Delphi, создавал движок на php, изучал C (забросил и перешел на п…
June 5, 2020, 1:09 p.m.
IscanderChe

QPlainTextEdit настройка цвета фона

Вечер добрый. Пытаюсь настроить цвет фона QPlainTextEdit следующим образом: CodeEditor::CodeEditor(QWidget *parent) : QPlainTextEdit(parent){ ... QPalette::ColorRole role = bac…
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB