Алексей Внуков
Алексей Внуков20 июля 2018 г. 9: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
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

6
Evgenii Legotckoi
  • 22 июля 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 июля 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 июля 2018 г. 2:44

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

      Также можно переопределить метод setData, чтобы можно было устанавливать состояние чекбокса. Таким образом можно будет через итерацию строк таблицы проверить, какие строки были выделены.
        Алексей Внуков
        • 24 июля 2018 г. 8:07
        • (ред.)
        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


          Evgenii Legotckoi
          • 24 июля 2018 г. 8:20

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

            Алексей Внуков
            • 24 июля 2018 г. 8:23

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

              Комментарии

              Только авторизованные пользователи могут публиковать комментарии.
              Пожалуйста, авторизуйтесь или зарегистрируйтесь
              SH
              • Sak Hax
              • 25 апреля 2024 г. 14:00

              C++ - Тест 001. Первая программа и типы данных

              • Результат:33баллов,
              • Очки рейтинга-10
              г
              • ги
              • 23 апреля 2024 г. 15:51

              C++ - Тест 005. Структуры и Классы

              • Результат:41баллов,
              • Очки рейтинга-8
              l
              • laei
              • 23 апреля 2024 г. 9:19

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:10баллов,
              • Очки рейтинга-10
              Последние комментарии
              k
              kmssr8 февраля 2024 г. 18:43
              Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              АК
              Анатолий Кононенко5 февраля 2024 г. 1:50
              Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              EVA
              EVA25 декабря 2023 г. 10:30
              Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
              J
              JonnyJo25 декабря 2023 г. 8:38
              Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
              G
              Gvozdik18 декабря 2023 г. 21:01
              Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
              Сейчас обсуждают на форуме
              G
              Gar22 апреля 2024 г. 5:46
              Clipboard Как скопировать окно целиком в clipb?
              DA
              Dr Gangil Academics20 апреля 2024 г. 7:45
              Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
              a
              a_vlasov14 апреля 2024 г. 6:41
              Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
              Павел Дорофеев
              Павел Дорофеев14 апреля 2024 г. 2:35
              QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
              f
              fastrex4 апреля 2024 г. 4:47
              Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

              Следите за нами в социальных сетях