Алексей Внуков
Алексей ВнуковJuly 20, 2018, 9:30 a.m.

как проверить состояние у динамически созданного 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 } } } }
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.

Do you like it? Share on social networks!

6
Evgenii Legotckoi
  • July 22, 2018, 2:20 p.m.

Добрый день!


По хорошему, у вас в модели должно быть свойство, которое отвечает за значение чекбокса.
Я не знаю, какую структуру имеет ваша модель данных записей о дверях, но если взять чисто 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, должна быть возможность каким-то образом сохра
    Алексей Внуков
    • July 22, 2018, 4:14 p.m.
    модель у меня универсальная, идею понял. спасибо буду пробовать.
    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
      • July 23, 2018, 2:44 a.m.

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

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


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

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

              Comments

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

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

              • Result:50points,
              • Rating points-4
              m

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

              • Result:80points,
              • Rating points4
              m

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

              • Result:20points,
              • Rating points-10
              Last comments
              ИМ
              Игорь МаксимовNov. 22, 2024, 11:51 a.m.
              Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii LegotckoiOct. 31, 2024, 2:37 p.m.
              Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZEOct. 19, 2024, 8:19 a.m.
              Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь МаксимовOct. 5, 2024, 7:51 a.m.
              Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas5July 5, 2024, 11:02 a.m.
              QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Now discuss on the forum
              Evgenii Legotckoi
              Evgenii LegotckoiJune 24, 2024, 3:11 p.m.
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              t
              tonypeachey1Nov. 15, 2024, 6:04 a.m.
              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
              NSProject
              NSProjectJune 4, 2022, 3:49 a.m.
              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
              9
              9AnonimOct. 25, 2024, 9:10 a.m.
              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

              Follow us in social networks