Алексей Внуков
Алексей Внуков20 липня 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
Стабільний хостинг, на якому розміщується соціальна мережа 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 р. 02:44

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

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

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

            Алексей Внуков
            • 24 липня 2018 р. 08:23

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

              Коментарі

              Only authorized users can post comments.
              Please, Log in or Sign up
              AD

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

              • Результат:50бали,
              • Рейтинг балів-4
              m
              • molni99
              • 26 жовтня 2024 р. 01:37

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

              • Результат:80бали,
              • Рейтинг балів4
              m
              • molni99
              • 26 жовтня 2024 р. 01:29

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

              • Результат:20бали,
              • Рейтинг балів-10
              Останні коментарі
              ИМ
              Игорь Максимов22 листопада 2024 р. 11:51
              Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii Legotckoi31 жовтня 2024 р. 14:37
              Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZE19 жовтня 2024 р. 08:19
              Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь Максимов05 жовтня 2024 р. 07:51
              Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas505 липня 2024 р. 11:02
              QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Тепер обговоріть на форумі
              Evgenii Legotckoi
              Evgenii Legotckoi24 червня 2024 р. 15:11
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              t
              tonypeachey115 листопада 2024 р. 06:04
              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
              NSProject
              NSProject04 червня 2022 р. 03:49
              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
              9
              9Anonim25 жовтня 2024 р. 09:10
              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

              Слідкуйте за нами в соціальних мережах