MihailllFeb. 10, 2020, 9:53 a.m.

Где взять модель для Qt

Добрый день.
Нужно в Qt на с++ построить модель из нескольких векторов.
Нет ли у вас подобной модели или ссылки на нее?

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.
13

Добрый день.
Лично у меня нет, это уже скорее вопрос конкретной реализации ((

Мне хотя бы какой-то пример реализации, то что в документации Qt не понятно и не работает

Подробнее опишите.
Просто например вот здесь была подобная задача вроде бы, но там много кода было

Да, многовато .
Мне бы простенькую модель, наследованную к примеру от QAbstractTableModel, с возможность ее заполнять и обновлять.

Тогда не понятна вторая часть вопрос. При чём тут несколько векторов? В документации есть пример модели Models and Views: QAbstractItemModel Example , по сути вам нужно будет поменять QAbstractItemModel на QAbstractTableModel , и возможно дополнить недостающие виртуальные методы.

Но что значит несколько векторов, вот этого я пока не понимаю в вашем вопросе.

Просто пока я храню информацию в нескольких векторах и хотел бы ее записать в модель

хммм...

Ну допустим у вас есть три вектора

  • std::vector vec_1
  • std::vector vec_2
  • std::vector vec_3

и если у вас размер всех трёх векторов одинаковый, то можете создать класс или структуру

struct Info
{
    int value_1;
    QString value_2;
    double value_3;
}

И использовать вместо трёх векторов, вектор одной структуры

std::vector infos

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

Сделал так, скажите пожалуйста как правильней переопределить MyModel::data, что бы получать данные из листов?

class MyModel : public QAbstractListModel
{
    Q_OBJECT
public:
    enum Roles {
        Role1 = Qt::UserRole + 1,
        Role2,
        Role3
    };

    MyModel(QObject *parent = 0);

    void addAnimal(QString str1, QString str2, QString str3);

    int rowCount(const QModelIndex & parent = QModelIndex()) const;

    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;

protected:
    QHash<int, QByteArray> roleNames() const;
private:
    QList <QString> list1, list2, list3;
};
MyModel::MyModel(QObject *parent)
    : QAbstractListModel(parent)
{
}

void MyModel::addAnimal(QString str1, QString str2, QString str3)
{
    list1.append(str1);
    list2.append(str2);
    list3.append(str3);
}

int MyModel::rowCount(const QModelIndex & parent) const {
    Q_UNUSED(parent);
    return list1.count();
}

QVariant MyModel::data(const QModelIndex & index, int role) const {
    if (index.row() < 0 || index.row() >= list1.count())
        return QVariant();

    const Animal &animal = m_animals[index.row()];
    if (role == TypeRole)
        return animal.type();
    else if (role == SizeRole)
        return animal.size();
    return QVariant();
}

//![0]
QHash<int, QByteArray> MyModel::roleNames() const {
    QHash<int, QByteArray> roles;
    roles[Role1] = "role1";
    roles[Role2] = "role2";
    roles[Role3] = "role3";
    return roles;
}

Правильно ли так?

QVariant MyModel::data(const QModelIndex & index, int role) const {
    if (index.row() < 0 || index.row() >= list1.count())
        return QVariant();

    if(index.column() == 0){
        return list1[index.row()];
    }
    if(index.column() == 1){
        return list2[index.row()];
    }
    if(index.column() == 2){
        return list3[index.row()];
    }
    return QVariant();
}

Такая модель работает, но в QML в таблице не отображается. Попробовал наследоваться от QAbstractTableModel, но получил ошибку при создании модели
E:\QTProject\testQmlTable\main.cpp:23: ошибка: invalid new-expression of abstract class type 'MyModel'
MyModel *myModel = new MyModel();

Скажите пожалуйста, как это исправить?

class MyModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    enum Roles {
        Role1 = Qt::UserRole + 1,
        Role2,
        Role3
    };

    MyModel(QObject *parent = 0);

    void addRow(QString str1, QString str2, QString str3);

    int rowCount(const QModelIndex & parent = QModelIndex()) const;

    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;

protected:
    QHash<int, QByteArray> roleNames() const;
private:
    QList <QString> list1, list2, list3;
};

Не хватало метода int columnCount(const QModelIndex &parent) const;, но остался последний баг, возвращает только 1 столбец, 2 и 3 такие же, как и 1.
Почему интекс столбца всегда равен 0.

  • Feb. 10, 2020, 2:31 p.m.
  • The answer was marked as a solution.

Так работает

QVariant MyModel::data(const QModelIndex & index, int role) const {
    if (index.row() < 0 || index.row() >= list1.count())
        return QVariant();
    if(role == 0){
        return QVariant(list1[index.row()]);
    }
    if(role == 1){
        return QVariant(list2[index.row()]);
    }
    if(role == 2){
        return QVariant(list3[index.row()]);
    }
    return QVariant();
}

Объедините все эти вектора в один вектор струтуры, как я написал выше. Чтобы подход был ООП.

Comments

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

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
VD

C++ - Test 001. The first program and data types

  • Result:73points,
  • Rating points1
Ds

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

  • Result:64points,
  • Rating points-1
o

C++ - Test 001. The first program and data types

  • Result:86points,
  • Rating points6
Last comments
RG

QML - Lesson 016. SQLite database and the working with it in QML Qt

Добрый день! можно как то обойтись без метода updateModel()? После вызова этого метода происходит перерисовка страницы(если я правильно понимаю), и все элементы, например, CheckBox перерисовываю…
D:

QML - Lesson 016. SQLite database and the working with it in QML Qt

Добрый день, пытаюсь разобраться и подргнать пример под себя. Есть бд с огромным количеством полей. В приложении на виджетах при использовании QTableView все работает и путем простого sql запрос…

Django - Tutorial 039. Adding private messages and chats on the site - Part 2 (Dialogue and chat counter with unread messages)

Добавляйте поле файла в модель сообщения. И в форме сообщения указывайте, что поле с файлом.
s

Django - Tutorial 023. Like Dislike system using GenericForeignKey

все, я со всем разобрался!) Извините!)
Now discuss on the forum

Наследование QWidget

Это утверждение ничего не значит. Наличие методов и т.д. не делает обязательным наследование в том виде, в котором вы его изначально попытались сделать. Тем более, если у вас будет два видж…

Динамическое заполнение StackLayout в qml

Всем привет. Пытаюсь решить такую задачку, есть TabBar и его кнопки. StackLayout{ currentIndex: tabBar.currentIndex A {id: tabA} B {id: tabB} C {id: tabC} D {id: ta…
M

QML: изменение стиля при наведении и при нажатии на кнопку

enabled = false перестанет быть активной и не будет ни на что реагировать) Хм.. по-моему пробовал такое. Проверю ещё раз после работы. Ура, спасибо большо…
U

Динамическое наполнение StackView QML

Во затупил))) Спасибо за все))) StackView.push("ModuleTip1.qml") ну или в сложной иерархии StackView.push("qrc:/folder/ModuleTip1.qml") и всего делов... Не пойму, почему сра…

QEventLoop тормозит при удалении экземпляра

Думаю, что нет. Лучше вообще без исключений, но не всегда возможно.
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB