Политика конфиденциальностиКонтактыО сайтеОтзывы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 } } } }
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
  • 22 июля 2018 г. 20: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());
    }
}
0

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

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


0

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

0

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

1

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
ДД
13 декабря 2018 г. 16:24
Дмитрий Дубовик

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

  • Результат:66баллов,
  • Очки рейтинга-1
13 декабря 2018 г. 16:04
Metelev

Qt - Тест 001. Сигналы и слоты

  • Результат:47баллов,
  • Очки рейтинга-6
YC
12 декабря 2018 г. 18:49
Yaroslav Chernetskyi

Qt - Тест 001. Сигналы и слоты

  • Результат:31баллов,
  • Очки рейтинга-10
Последние комментарии
V
15 декабря 2018 г. 2:06
Vlad15007

Спасибо большое!Очень помогли!
11 декабря 2018 г. 21:01
Евгений Легоцкой

Не знаю, какой-там конкретно эффект и если честно не хочется fl studio ради того, чтобы посмотреть устанавливать, но из того, что увидел в интернете. Предполагаю, что то, что вы хотите с...
V
11 декабря 2018 г. 19:25
Vlad15007

Подскажите пожалуйста ( я новичок совсем)Можно ли организовать спрайт без этого окошка (как в fl studio fruity dance)?
11 декабря 2018 г. 15:06
Евгений Легоцкой

Что интересно, если написать так from <application_name>.<module_name> import <filename> ,то PyCharm сносит крышу, если разрабатываешь в рамках проекта приложение, ко...
11 декабря 2018 г. 14:52
Илья Чичак

Тут мне тоже есть что сказать=) Сами разрабы советуют импортировать следующим образом: from <application_name> import <module_name> Стоит избегать from . import &l...;
Сейчас обсуждают на форуме
17 декабря 2018 г. 17:55
Евгений Легоцкой

Просчитывать перекрытие точек и не отрисовывать те точки, которые перекрываются другими. У вас их просто слишком много, нужно смотреть, какие можно не отрисовывать без потери информативн...
R
16 декабря 2018 г. 14:41
RED_Spider

перевірено все працює http://doc.qt.io/qt-5/appicon.html Setting the Application Icon on Windows First, create an ICO format bitmap file that contains the icon image. This ca...
16 декабря 2018 г. 11:26
Евгений Легоцкой

Только статические методы и участники класса можно вызывать подобным образом Cell::sum У вас же они нестатические, чтобы их вызывать, нужно иметь объект Cell. Вы его, конечно, со...
q
15 декабря 2018 г. 23:02
qdu10719

Понял, спасибо большое
БГ
14 декабря 2018 г. 17:44
Булат Гиниятов

Большое всем спасибо за помощь! Использую вариант с QList.
Присоединяйтесь к нам в социальных сетях

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