10 февраля 2020 г. 9:53

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

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
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.

  • 10 февраля 2020 г. 14:31
  • Ответ был помечен как решение.

Так работает

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();
}

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

p
17 февраля 2020 г. 14:41
pstMem

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

  • Результат:85баллов,
  • Очки рейтинга6
z
17 февраля 2020 г. 6:02
zet

C++ - Тест 006. Перечисления

  • Результат:80баллов,
  • Очки рейтинга4
z
17 февраля 2020 г. 5:49
zet

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

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии
24 февраля 2020 г. 3:54
Евгений Легоцкой

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

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

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

Добрый вечер! Монжно по подробней о теге get_companion? ссылка не работает.
Сейчас обсуждают на форуме
24 февраля 2020 г. 6:29
Евгений Легоцкой

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

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

void sendImage(int sessid, int type, int dest, int format, QString imgBase64Data){ QNetworkRequest request; request.setUrl(QUrl(ipAddress + "ctlapi/cmd=preparereportimg&sessid=…
20 февраля 2020 г. 14:40
mkdir

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

Вот так похоже можно https://doc.qt.io/qt-5/qtpurchasing-index.html
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB