Feb. 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
Donate

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

p
Feb. 17, 2020, 2:41 p.m.
pstMem

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

  • Result:85points,
  • Rating points6
z
Feb. 17, 2020, 6:02 a.m.
zet

C++ - Test 006. Enumerations

  • Result:80points,
  • Rating points4
z
Feb. 17, 2020, 5:49 a.m.
zet

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

  • Result:80points,
  • Rating points4
Last comments
Feb. 24, 2020, 3:54 a.m.
Evgenij Legotskoj

Добрый день. Там будет url, на который указывает ссылка тега a в пагинаторе, если правильно помню )) Написал этот код и забыл.
B
Feb. 24, 2020, 12:37 a.m.
BahaMeirman

Евгений Здравствуйте! Не могу понять вот эту часть кода: url: jQuery(this).attr('action') наверное здесь должен быть путь к url, тогда 'action' на какой url указывает?
Feb. 17, 2020, 3:22 a.m.
Evgenij Legotskoj

Добрый день. Это кастомный тег, помещается в файл, который находится в каталоге templatetags myapp/ templatetags/ myapp.py
B
Feb. 16, 2020, 1:36 p.m.
BahaMeirman

Добрый вечер! Монжно по подробней о теге get_companion? ссылка не работает.
Now discuss on the forum
Feb. 24, 2020, 6:29 a.m.
Evgenij Legotskoj

Qt не предоставляет функционала по запросу root прав во время выполнения программы. Поэтому нужно использовать платформозависимый функционал, для Linux это будет выглядеть так: #include…
Feb. 24, 2020, 3:47 a.m.
Evgenij Legotskoj

Добрый день. Что означает клиентская область? Это изображение? Вам нужно распознавать символы текста или всё-таки пользователь будет вводить текст с клавиатуры, просто в любом месте "абстр…
VZ
Feb. 21, 2020, 5:19 a.m.
Vladimir Zhitkovsky

void sendImage(int sessid, int type, int dest, int format, QString imgBase64Data){ QNetworkRequest request; request.setUrl(QUrl(ipAddress + "ctlapi/cmd=preparereportimg&sessid=…
Feb. 20, 2020, 2:40 p.m.
mkdir

Здравствуйте! Пишу игру - 2D платформер в среде Qt. Имею не очень много опыта в разработке. Подскажите, как можно реализовать ситуацию, где QGraphicScene больше, чем QGraphicView и надо двигать …
Feb. 20, 2020, 7:12 a.m.
Mihailll

Вот так похоже можно https://doc.qt.io/qt-5/qtpurchasing-index.html
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB