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(), сделайте проверку на соответствие, если не сходится, то установите индекс в соответствующую позицию

      Пікірлер

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

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

      • Нәтиже:66ұпай,
      • Бағалау ұпайлары-1
      t

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

      • Нәтиже:33ұпай,
      • Бағалау ұпайлары-10
      t

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

      • Нәтиже:52ұпай,
      • Бағалау ұпайлары-4
      Соңғы пікірлер
      G
      GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
      Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
      d
      dblas5Шілде 5, 2024, 11:02 Т.Ж.
      QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
      k
      kmssrАқп. 8, 2024, 6:43 Т.Қ.
      Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
      АК
      Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
      Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
      Енді форумда талқылаңыз
      Evgenii Legotckoi
      Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
      добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
      F
      FynjyШілде 22, 2024, 4:15 Т.Ж.
      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
      BlinCT
      BlinCTМаусым 25, 2024, 1 Т.Ж.
      Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
      BlinCT
      BlinCTМамыр 5, 2024, 5:46 Т.Ж.
      Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
      Evgenii Legotckoi
      Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
      Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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