Алексей Внуков
Алексей Внуков20. Juli 2018 09:30

как проверить состояние у динамически созданного CheckBox в qml

qml qt

доброго времени суток, есть ListView, модель у него результат запроса из БД, делегатом выступает CheckBox, пользователь выбирает нужные чекбоксы в зависимости от чего в БД записываются разные данные. выбор может быть как множественным так и единичным. как мне проверить какие из чекбоксов были выбраны?
ListView
{
    id: list_doors
    anchors.fill: parent

    Component.onCompleted:  model = doorModel

    delegate: CheckBox 
{ text: DoorName indicator: Rectangle { implicitHeight:16 implicitWidth:16 radius: 3 border.color: activeFocus ? "darkblue" : "gray" border.width: 1 Rectangle
{ visible: checked color: "#555" border.color: "#333" radius: 1 anchors.margins: 4 anchors.fill: parent } } } }
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

6
Evgenii Legotckoi
  • 22. Juli 2018 14:20

Добрый день!


По хорошему, у вас в модели должно быть свойство, которое отвечает за значение чекбокса.
Я не знаю, какую структуру имеет ваша модель данных записей о дверях, но если взять чисто QML модель - ListModel - , то в ней обычно располагаются элементы, в которых определены некоторые параметры.
Так вот, имея некоторый обработчик действие, например, нажатие кнопки, можно в этом обработчике проверить состояния конкретного свойства в элементе списка.
import QtQuick 2.11
import QtQuick.Window 2.11
import QtQuick.Controls 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ListView
    {
        id: list_doors
        anchors {
            top: parent.top
            left: parent.left
            right: parent.right
            bottom: parent.verticalCenter
            margins: 10
        }


        delegate: CheckBox
        {
            id: checkBoxDelegate
            checked: checkBoxValue
            text: DoorName
            indicator: Rectangle
            {
                 implicitHeight:16
                 implicitWidth:16
                 radius: 3
                 border.color: activeFocus ? "darkblue" : "gray"
                 border.width: 1
                 Rectangle
                 {
                     visible: checked
                     color: "#555"
                     border.color: "#333"
                     radius: 1
                     anchors.margins: 4
                     anchors.fill: parent
                 }
             }

            onClicked: {
                // При изменении состояния чекбокса производим установку его состояния в модель данных
                list_doors.model.setProperty(index, "checkBoxValue", checkBoxDelegate.checked)
            }
         }

        model: ListModel {
            ListElement { checkBoxValue: true; DoorName: "1 Door"; }
            ListElement { checkBoxValue: false; DoorName: "2 Door"; }
            ListElement { checkBoxValue: false; DoorName: "3 Door"; }
            ListElement { checkBoxValue: true; DoorName: "4 Door"; }
        }
     }

    Button {
        anchors {
            left: parent.left
            bottom: parent.bottom
            margins: 10
        }

        text: qsTr("Get checked")

        onClicked: {
            for (var i = 0; i < list_doors.model.count; ++i)
            {
                // Проверяемя состояния чекбоксов
                console.log(list_doors.model.get(i).checkBoxValue)
            }
        }
    }
}
Но в данном случае обязательно нужно иметь какую-то возможность для получения данного свойства.
То есть в вашей модели doorModel, должна быть возможность каким-то образом сохра
    Алексей Внуков
    • 22. Juli 2018 16:14
    модель у меня универсальная, идею понял. спасибо буду пробовать.
    sqlquerymodel.h
    
    
    
    #ifndef SQLQUERYMODEL_H
    #define SQLQUERYMODEL_H
    
    #include <QObject>
    #include <QSqlQueryModel>
    #include <QSqlRecord>
    #include <QSqlField>
    
    class SqlQueryModel : public QSqlQueryModel
    {
        Q_OBJECT
    public:
        explicit SqlQueryModel(QObject *parent=0);
    
        void setQuery(const QString &query, const QSqlDatabase &db=QSqlDatabase());
        void setQuery(const QSqlQuery &query);
        QVariant data(const QModelIndex &index, int role) const;
        QHash <int,QByteArray> roleNames() const{return m_roleNames;}
    
    private:
        void generateRoleNames();
        QHash <int,QByteArray> m_roleNames;
    };
    
    
    sqlquerymodel.cpp
    
    #include "sqlquerymodel.h"
    
    SqlQueryModel::SqlQueryModel(QObject *parent) : QSqlQueryModel(parent)
    {
    
    }
    
    void SqlQueryModel::setQuery(const QString &query, const QSqlDatabase &db)
    {
        QSqlQueryModel::setQuery(query,db);
        generateRoleNames();
    }
    
    void SqlQueryModel::setQuery(const QSqlQuery &query)
    {
        QSqlQueryModel::setQuery(query);
        generateRoleNames();
    }
    
    QVariant SqlQueryModel::data(const QModelIndex &index, int role) const
    {
        QVariant value;
        if(index.isValid())
        {
            if(role<Qt::UserRole)
            {
                value=QSqlQueryModel::data(index,role);
            }
            else
            {
                int columnIdx=role - Qt::UserRole -1;
                QModelIndex modelIndex=this->index(index.row(),columnIdx);
                value = QSqlQueryModel::data(modelIndex,Qt::DisplayRole);
            }
        }
        return value;
    }
    
    void SqlQueryModel::generateRoleNames()
    {
        m_roleNames.clear();
        for (int i=0;i<record().count();i++)
        {
            m_roleNames.insert(Qt::UserRole+i+1,record().fieldName(i).toUtf8());
        }
    }
    
      Evgenii Legotckoi
      • 23. Juli 2018 02:44

      Тогда можно расширить эту модель, наследоваться от неё. И добавить в качестве роли ещё и состояние чекбокса, для выбора.

      Также можно переопределить метод setData, чтобы можно было устанавливать состояние чекбокса. Таким образом можно будет через итерацию строк таблицы проверить, какие строки были выделены.
        Алексей Внуков
        • 24. Juli 2018 08:07
        • (bearbeitet)
        sqldoorsmodel.h
        
        #ifndef SQLDOORSMODEL_H
        #define SQLDOORSMODEL_H
        
        #include <QObject>
        #include <QSqlQueryModel>
        #include <QMap>
        #include <QDebug>
        
        class SqlDoorsModel : public QSqlQueryModel
        {
            Q_OBJECT
        public:
            enum Roles
            {
                doornRole=Qt::UserRole+1,
                doorNameRole,
                doorModeRole,
                openLockTimeRole,
                openDoorTimeRole,
                verifyTimeRole,
                openAlarmTimeRole,
                enterVerifyModeRole,
                exitVerifyModeRole,
                duressPasswRole,
                emergencyPasswRole,
                passModeRole
            };
            explicit SqlDoorsModel(QObject *parent = nullptr);
        
            Q_INVOKABLE QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
            Q_INVOKABLE QVariantMap get(int idx) const;
            Q_INVOKABLE void set(const int &item, const QVariant &value);
            Q_INVOKABLE QVariant get_door(const int &item);
        
        protected:
        
            QHash<int, QByteArray> roleNames() const;
        
        signals:
            void statusChanged();
        
        public slots:
            void updateModel();
            int getId(int row);
        
        private:
            QMap<int, QVariant> m_Data;
        };
        
        #endif // SQLDOORSMODEL_H
        
        
        sqldoorsmodel.cpp
        #include "sqldoorsmodel.h"
        
        SqlDoorsModel::SqlDoorsModel(QObject *parent): QSqlQueryModel(parent)
        {
            this->updateModel();
        }
        
        QVariant SqlDoorsModel::data(const QModelIndex &index, int role) const
        {
            int columnId = role - Qt::UserRole - 1;
             QModelIndex modelIndex = this->index(index.row(), columnId);
            return QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
        }
        
        QVariantMap SqlDoorsModel::get(int idx) const
        {
            QVariantMap map;
            foreach(int k, roleNames().keys()) {
                map[roleNames().value(k)] = data(index(idx, 0), k);
            }
            return map;
        }
        
        void SqlDoorsModel::set(const int &item, const QVariant &value)
        {
            m_Data.insert(item,value);
            qDebug()<<"insert";
        
        }
        
        QVariant SqlDoorsModel::get_door(const int &item)
        {
            QVariant door;
            door=m_Data.value(item);
            return door;
        }
        
        
        QHash<int, QByteArray> SqlDoorsModel::roleNames() const
        {
            QHash<int, QByteArray> roles;
            roles[doornRole] = "doorn";
            roles[doorNameRole] = "doorName";
            roles[doorModeRole] = "doorMode";
            roles[openLockTimeRole] = "openLockTime";
            roles[openDoorTimeRole] = "openDoorTime";
            roles[verifyTimeRole] = "verifyTime";
            roles[openAlarmTimeRole] = "openAlarmTime";
            roles[enterVerifyModeRole] = "enterVerifyMode";
            roles[exitVerifyModeRole] = "exitVerifyMode";
            roles[duressPasswRole] = "duressPassw";
            roles[emergencyPasswRole] = "emergencyPassw";
            roles[passModeRole] = "passMode";
            return roles;
        }
        
        void SqlDoorsModel::updateModel()
        {
           this->setQuery("select doorn, doorname, doormode, openlocktime, opendoortime, verifytime, openalarmtime, enterverifymode, exitverifymode, duresspassw, emergencypassw, passmode from param");
        }
        
        int SqlDoorsModel::getId(int row)
        {
            return this->data(this->index(row, 0), doornRole).toInt();
        }
        
        в qml
        
                             onCheckedChanged: {
        
                                 if (checkBoxDelegate.checked==false)
                                 {
                                 doorModel.set(doorn,"unchecked")
                                 }
                                 else doorModel.set(doorn,"checked")
                             }
        с расширить модель, и с setData ничего не получилось, решил задачу другим способом:
        добавил в модель QMap<int, QVariant> m_Data, ключом выступает id записи в БД, а в значение, в зависимости от состояния, checked/unchecked.
        во время работы выбор пользователя записывается в QMap и, где необходимо, обрабатываю QMap


          Ну так тоже можно. Поздравляю ))

            спасибо за указание направления поиска идеи

              Kommentare

              Nur autorisierte Benutzer können Kommentare posten.
              Bitte Anmelden oder Registrieren
              Letzte Kommentare
              A
              ALO1ZE19. Oktober 2024 08:19
              Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь Максимов5. Oktober 2024 07:51
              Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas55. Juli 2024 11:02
              QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              k
              kmssr8. Februar 2024 18:43
              Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              Jetzt im Forum diskutieren
              J
              JacobFib17. Oktober 2024 03:27
              добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
              JW
              Jhon Wick1. Oktober 2024 15:52
              Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
              КГ
              Кирилл Гусарев27. September 2024 09:09
              Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
              F
              Fynjy22. Juli 2024 04:15
              при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

              Folgen Sie uns in sozialen Netzwerken