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
DK

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:10points,
  • Rating points-10
DK

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:0points,
  • Rating points-10
RV

C++ - Test 002. Constants

  • Result:66points,
  • Rating points-1
Last comments
s

Qt - Selecting data from a QSqlQuery database in a QThread stream and creating a QAbstractTableModel model based on it

Перенес в класс потока все функции для работы с БД, но все по старому когда закрываю поток основное соединение тоже закрывается
s

Qt - Selecting data from a QSqlQuery database in a QThread stream and creating a QAbstractTableModel model based on it

Упс, видимо нет, буду проверять. У меня просто собраны функции работы с базой данных, и подключение новое, но в функция #ifndef FUNCTIONS_H#define FUNCTIONS_H#include <QTextCodec>#i…

Qt - Selecting data from a QSqlQuery database in a QThread stream and creating a QAbstractTableModel model based on it

Вы полностью создаете новое соединение? И при создании объекта QSqlQuery или модели указываете алиас подключения?
s

Qt - Selecting data from a QSqlQuery database in a QThread stream and creating a QAbstractTableModel model based on it

Если в: QSQLDatabase db_thread = QSQLDatabase::addDatabase("MYSQL","db_new_name"); крашится после запуска сразу

Qt - Selecting data from a QSqlQuery database in a QThread stream and creating a QAbstractTableModel model based on it

В потоке надо создавать свое соединение с БД с другим именем.
Now discuss on the forum
DK

Qml, tableview

через делегат https://evileg.com/ru/post/624/

Связь таблиц Qt SQL

добрый, у вас по сути два варианта: 1. делать каскадное удаление из БД по внешним ключам(но если архетиктура базы с ошибками то могут быть сбои) 2. делать контролируемо удаление из вто…
A.

Работа с WinAPI в QT(изменение title bar)

void MainWindow::mousePressEvent(QMouseEvent *event){ if(event->pos().y() <= 45 && event->pos().y() >= 16) mpos = event->pos(); else if(event->pos().y…

QSqlTableModel - Как добавить картинки в таблицу, чтобы они отражались в диалоговом окне, но не были частью модели

Ну тогда в этом столбце указывайте пути на несколько картинок
U

Qt наследование и виджеты

Наверное нужно написать класс-интерфейс IBasic и потом попробовать IBasic *b = qobject_cast (tmpWidget); ? Но у меня в базовых классах A,B - формы... Получается, ч…
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB