Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
20 июля 2018 г. 13: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 } } } }
Возврат 10% от суммы заказа отеля на Booking
Возврат 10% от суммы заказа отеля на Booking
Предлагаем ссылку с 10% возвратом от суммы заказа при бронировании отеля через Booking
6

Добрый день!


По хорошему, у вас в модели должно быть свойство, которое отвечает за значение чекбокса.
Я не знаю, какую структуру имеет ваша модель данных записей о дверях, но если взять чисто 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, должна быть возможность каким-то образом сохра
0
модель у меня универсальная, идею понял. спасибо буду пробовать.
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());
    }
}
0

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

Также можно переопределить метод setData, чтобы можно было устанавливать состояние чекбокса. Таким образом можно будет через итерацию строк таблицы проверить, какие строки были выделены.
0
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


0

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

0

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

1

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
ПМ
18 марта 2019 г. 15:12
Пётр Махнёв

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

  • Результат:50баллов,
  • Очки рейтинга-4
ЯГ
18 марта 2019 г. 7:59
Ян Греку

C++ - Тест 003. Условия и циклы

  • Результат:21баллов,
  • Очки рейтинга-10
МД
15 марта 2019 г. 16:32
Михаил Дементьев

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

  • Результат:60баллов,
  • Очки рейтинга-1
Последние комментарии
16 марта 2019 г. 13:55
Дмитрий

Спасибо за статью. Давно итересует следующий вопрос: с помощью переменных QMAKE_TARGET_COMPANYQMAKE_TARGET_PRODUCTQMAKE_TARGET_DESCRIPTIONможно задать свойства компилируемой программы, о...
JS
12 марта 2019 г. 10:19
Jean Stefanovich

Большое спасибо за разъяснения!
12 марта 2019 г. 10:04
Евгений Легоцкой

Hello, In fact, this functionality or is not implemented, or is not documented. I'm not sure. But I think, that it should be implemented in Text QML Type. Because of we can write text in...
12 марта 2019 г. 9:51
Евгений Легоцкой

Да вы правы. На самом деле проще через QSqlQueryModel, сколько не пытался использовать эти дженерики типо QSqlTableModel и QSqlRelationalTableModel, то всегда упирался в какие-то их ограничени...
JS
12 марта 2019 г. 9:47
Jean Stefanovich

Единицы измерения лежат там же где и названия продуктов. Просто в таблице ингредиенты нет ещё одного столбца, на который можно было бы установить setRelation. Я в итоге в базе создал ещё один ...
Сейчас обсуждают на форуме
17 марта 2019 г. 22:47
Евгений Легоцкой

Добрый день. Вот, нашлось у меня немного времени. Делается это через шаблон проектирования наблюдатель. GraphKS_mfvSlup.zip
ЧГ
15 марта 2019 г. 21:52
Чарльз Грин

спасибо, попробую, отпишусь
m
15 марта 2019 г. 19:41
mihamuz

Сори догадался)
n
12 марта 2019 г. 16:57
newbie.works.with.QT

Большооооое спасибо!!!!!Не передать как я вам благодарен, спасибо что всегда отзываетесь.Теперь я смогу продолжить работу в QT!!! (пробую писать бота (Я как вы могли догадаться немного не пр...
12 марта 2019 г. 13:20
BlinCT

Ну так если у вас есть готовая программа так ей и воспользуйтесь. Вы же написали ее вот и пользуйтесь.
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы