d
dufusСәуір 7, 2019, 5:35 Т.Ж.

Как вывести combobox динамически, чтоб каждый combobox соответствовал определённому idModel?

ComboBox, qt, QAbstractListModel, qml

Как вывести combobox динамически, чтоб каждый combobox соответствовал определённому idModel? У меня есть ThreeDModelTexture наследник QAbstractListModel, который имеет роли
Код проблеммы

    enum ThreeDModelRolse {
        nameRole = Qt::DisplayRole,
        idModelRole = Qt::UserRole + 1,
        urlRole = Qt::UserRole + 2
    };
  roles[idModelRole] = "idModel"; roles[nameRole] = "name"; roles[urlRole] = "url";

Полностью класс :
threedmodeltexture.h

#ifndef THREEDMODELTEXTURE_H
#define THREEDMODELTEXTURE_H

#include <QString>
#include <QObject>
#include <QString>
#include <QAbstractListModel>
#include <QList>
#include <QVariant>
#include <QModelIndex>
#include "baseqmlabstractlistmodel.h"
class Texture;

class ThreeDModelTexture: public QAbstractListModel
{
    Q_PROPERTY(int _idModel READ idmodel(int) )
    Q_PROPERTY(QString _name READ name(int) )
    Q_PROPERTY(QString _url READ url(int) )
public:
    ThreeDModelTexture(QObject *parent = nullptr);
    ~ThreeDModelTexture();
    enum ThreeDModelRolse {
        nameRole = Qt::DisplayRole,
        idModelRole = Qt::UserRole + 1,
        urlRole = Qt::UserRole + 2
    };
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    Q_INVOKABLE int rowCount(const QModelIndex &parent) const; // количество элементов в модели
    void addTexture(Texture tex)const;
    Q_INVOKABLE static int Count();
    Q_INVOKABLE static int boolMatchSearch(int id);

    Q_INVOKABLE int idmodel(const int &id);
    Q_INVOKABLE QString name(const int &id);
    Q_INVOKABLE QString url(const int &id);

public slots:
    QHash<int, QByteArray> roleNames() const;
    Q_INVOKABLE static QList<Texture> textures;
    QHash<int, QByteArray> roles; // роли
};

class Texture
{
public:
    Texture(int _idModel, QString _name, QString _url)
        :idModel(_idModel)
        , name(_name)
        , url(_url)
    {
//        idModel = _idModel;
//        name = _name;
//        url = _url;
    }
    void setName (QString _name)
    {
        name = _name;
    }
    void seturl (QString _url)
    {
        url = _url;
    }
    void setidModel (int _idModel)
    {
        idModel = _idModel;
    }
    QString getName() const
    {
        return name;
    }
    QString getUrl() const
    {
        return url;
    }
    int getIDModel() const
    {
        return idModel;
    }
private:
    int idModel;
    QString name;
    QString url;

};

#endif // THREEDMODELTEXTURE_H

threedmodeltexture.cpp

#include "threedmodeltexture.h"
#include <QDebug>
ThreeDModelTexture::ThreeDModelTexture(QObject *parent) :
    QAbstractListModel(parent)
{
    roles[idModelRole] = "idModel";
    roles[nameRole] = "name";
    roles[urlRole] = "url";
}

QList<Texture> ThreeDModelTexture::textures;

ThreeDModelTexture::~ThreeDModelTexture()
{

}

QVariant ThreeDModelTexture::data(const QModelIndex &index, int role) const
{
    if (index.row() < 0 || index.row() > ThreeDModelTexture::textures.count())
        return QVariant();
    const Texture tex = ThreeDModelTexture::textures[index.row()];
    if (role == idModelRole)
        return tex.getIDModel();
    else if (role == nameRole)
        return tex.getName();
    else if (role == urlRole)
        return tex.getUrl();
    return QVariant();
}

QHash<int, QByteArray> ThreeDModelTexture::roleNames() const
{
    return roles;
}

void ThreeDModelTexture::addTexture(Texture tex) const
{
    ThreeDModelTexture::textures << tex;
}

int ThreeDModelTexture::rowCount(const QModelIndex &parent) const
{
    return ThreeDModelTexture::textures.size();
}

int ThreeDModelTexture::Count()
{
    return ThreeDModelTexture::textures.size();
}

int ThreeDModelTexture::boolMatchSearch(int id)
{
    for(int i=0; i<ThreeDModelTexture::textures.size();i++)
    {
        if (ThreeDModelTexture::textures.at(i).getIDModel()==id)
        {
            return i;
        } else {
            return -1;
        }
    }
    return -1;
}

int idmodel(const int &id)
{
    for(int i=0; i<ThreeDModelTexture::textures.size();i++)
    {
        if (ThreeDModelTexture::textures.at(i).getIDModel()==id)
        {
            return ThreeDModelTexture::textures.at(i).getIDModel();
        } else {
            return -1;
        }
    }
}
QString name(const int &id)
{
    for(int i=0; i<ThreeDModelTexture::textures.size();i++)
    {
        if (ThreeDModelTexture::textures.at(i).getIDModel()==id)
        {
            return ThreeDModelTexture::textures.at(i).getName();
        } else {
            return "";
        }
    }
}
QString url(const int &id)
{
    for(int i=0; i<ThreeDModelTexture::textures.size();i++)
    {
        if (ThreeDModelTexture::textures.at(i).getIDModel()==id)
        {
            return ThreeDModelTexture::textures.at(i).getUrl();
        } else {
            return "";
        }
    }
}

main.cpp

создание экземпляров модели:

    ...
    ThreeDModels.addThreeDModel(new ThreeDModel("false", 1, "ccc","c"));
    ThreeDModels.addThreeDModel(new ThreeDModel("false", 3, "aaa","a"));
    ThreeDModels.addThreeDModel(new ThreeDModel("false", 5, "bbb","b"));


    TextureModel.addTexture(Texture(1, "masta", "masta.jpg"));
    TextureModel.addTexture(Texture(3, "aaa", "aaa.jpg"));
    TextureModel.addTexture(Texture(5, "bbb", "bbb.jpg"));
    TextureModel.addTexture(Texture(3, "ttt", "ttt.jpg"));

    view.engine()->rootContext()->setContextProperty("ThreeDM", &ThreeDModels);
    view.engine()->rootContext()->setContextProperty("TextureM", &TextureModel);

    view.setSource(QUrl("qrc:/Samples/Analysis/ViewshedGeoElement/ViewshedGeoElement.qml"));
    ...

ViewshedGeoElement.qml

        C1.TableView {
            anchors.top: rowLayout.bottom
            anchors.left: parent.left
            anchors.right: parent.right
            anchors.bottom: parent.bottom
            id: tableView
            clip: true
            sortIndicatorVisible: true
            currentRow: rowCount ? 0 : -1
            model: SortFilterProxyModel {
                source: ThreeDM.rowCount() > 0 ? ThreeDM : null

                sortOrder: tableView.sortIndicatorOrder
                sortCaseSensitivity: Qt.CaseInsensitive
                sortRole: ThreeDM.rowCount() && tableView.getColumn(tableView.sortIndicatorColumn).role !== "check" > 0 ?
                              tableView.getColumn(tableView.sortIndicatorColumn).role : ""
            }
            C1.TableViewColumn {
                width: 30
                role: "check"
                resizable: false
                delegate: C1.CheckBox {
                    id: checkBox
                    anchors.left: parent.left
                    anchors.leftMargin: parent.width / 3
                    checked: model.check
                    onVisibleChanged: if (visible) checked = model.check
                    onClicked: model.check = checked
                }
            }
            C1.TableViewColumn {
                width: 30
                role: "id"
                title: "id"
            }
            C1.TableViewColumn {
                width: 90
                role: "description"
                title: "description"
            }
            C1.TableViewColumn {
                width: 60
                role: "code"
                title: "code"
            }
            C1.TableViewColumn {
                width: 100
                role: "combobox"
                resizable: false
                title: "Текстура"
                delegate: C1.ComboBox {
                    id: comboListTexture
                    model: ListModel {
                        id: comboModel
                        dynamicRoles: true
                    }
                    Component.onCompleted: {
                        reload()
                    }
                    textRole:"name"
                    onActivated: console.log("Combo Box Index Changed To:", index, model.data(model.index(index, 0), Qt.UserRole + 2 ))

                    function reload() {
                        var i = comboListTexture.currentIndex
                        // console.log("TextureM.boolMatchSearch(1)",TextureM.getidmodel(1),TextureM.getname(1),TextureM.geturl(1))
                        // console.log("TextureM.boolMatchSearch(1)",TextureM._name,TextureM._idModel,TextureM._url)

                        comboListTexture.model = TextureM
                        comboListTexture.currentIndex = i
                    }
                }
            }

...
            style: TableViewStyle {
                headerDelegate: Rectangle {
                    height: textItem.implicitHeight
                    width: textItem.implicitWidth
                    Text {
                        id: textItem
                        anchors.fill: parent
                        anchors.leftMargin: 6
                        verticalAlignment: Text.AlignVCenter
                        horizontalAlignment: styleData.textAlignment
                        text: styleData.value
                    }
                    C1.CheckBox {
                        anchors.left: parent.left
                        anchors.leftMargin: parent.width / 3
                        property bool isPressed: styleData.pressed
                        visible: styleData.column === 0
                        onIsPressedChanged: {
                            if (isPressed && styleData.column === 0) {
                                checked  = !checked
                                for(var i = 0; i < ThreeDM.rowCount(); i++) {
                                    ThreeDM.setData(ThreeDM.index(i, 0), checked, "check")
                                }
                            }
                        }
                    }
                }
            }
        }
    }
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

2
Evgenii Legotckoi
  • Сәуір 8, 2019, 3:36 Т.Ж.
  • (өңделген)

Добрый день

При беглом взгляде на код возникает мысль, что вам нужно в методе onCompleted использовать модифицированную версию функции reload, в которой будет устанавливаться первоначальное состояние комбобоксов в зависимости от наименования объекта, то есть названия aaa, bbb, и т.д. Нужно пройтись в цикле по модели и инициализировать модель.

Либо сделать этот сразу в методе addThreeDModel .

    Алексей Внуков
    • Сәуір 8, 2019, 5:28 Т.Ж.

    у комбобокса есть ф-я currentText(), сделайте проверку на соответствие, если не сходится, то установите индекс в соответствующую позицию

      Пікірлер

      Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
      Кіріңіз немесе Тіркеліңіз
      AD

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

      • Нәтиже:50ұпай,
      • Бағалау ұпайлары-4
      m
      • molni99
      • Қаз. 26, 2024, 1:37 Т.Ж.

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

      • Нәтиже:80ұпай,
      • Бағалау ұпайлары4
      m
      • molni99
      • Қаз. 26, 2024, 1:29 Т.Ж.

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

      • Нәтиже:20ұпай,
      • Бағалау ұпайлары-10
      Соңғы пікірлер
      ИМ
      Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
      Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
      Evgenii Legotckoi
      Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
      Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
      A
      ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
      Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
      ИМ
      Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
      Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
      d
      dblas5Шілде 5, 2024, 11:02 Т.Ж.
      QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
      Енді форумда талқылаңыз
      m
      moogoҚар. 22, 2024, 7:17 Т.Ж.
      Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
      Evgenii Legotckoi
      Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
      добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
      t
      tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
      google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
      NSProject
      NSProjectМаусым 4, 2022, 3:49 Т.Ж.
      Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

      Бізді әлеуметтік желілерде бақылаңыз