Форум программистов, компьютерный форум CyberForum.ru

Qt

Войти
Регистрация
Восстановить пароль
 
 
Nell_core
3 / 3 / 1
Регистрация: 19.08.2016
Сообщений: 90
#1

Модель строк с иконками - C++ Qt

04.01.2017, 20:52. Просмотров 305. Ответов 23
Метки нет (Все метки)

Привет всем!

Уже пару дней бьюсь, пытаюсь создать модель строчек с иконками, ничего не получаецо.

Наследовал всё подряд, напирмер, QAbstractItemModel. Метод data имеет возвращаемый тип QVariant, как мне в QVariant вернуть строку с иконкой?

А что самое интересное, когда я ставлю тот же QListWidget, забиваю его QListWidgetItem'ами с иконками, потом достаю из него модель методом model() и вставляю эту модель в представление, то всё работает! Представление отлично отображает строчки с иконками. Значит, технически создать такою модель вполне возможно. Пытался даже сделать модель, которая в качестве значения возвращает QListWidgetItem, но нельзя, он не конвертируется в QVariant. Насколько я понял, Qt надо мной издевается.

Ещё и у Шлее этого нет... Кто-нибудь умеет в это?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2017, 20:52     Модель строк с иконками
Посмотрите здесь:

Проблема с иконками на тулбаре - C++ Qt
Нужно создать тулбар, на котором кнопки представлены иконками. Но мне никак не заставить его показать иконки - пустой тулбар, и , если...

Прокси модель или новая модель? - C++ Qt
Вообщем у меня есть модель данных, в которой хранятся 2 хромосомы n-ой длины и операторы кроссинговера. После кроссинговера некоторые...

Модель-представление - C++ Qt
Здравствуйте, пытаюсь реализовать, что-то подобное hex - редактору. Есть два TableView. В одном планируется отображать побайтово...

Модель отображения - C++ Qt
Всем добрый вечер. У меня в комбобоксе ~70 элементов. Просто числа. Приходится листать, чтобы добраться до последнего. Нельзя ли...

Файловая модель - C++ Qt
Доброго времени суток уважаемые форумчане! Работая с моделью QDirModel заметил, что моделька работает медленно, даже медленней чем...

Модель-представление - C++ Qt
Я новичок, читаю учебник по qt. Прошёл виджеты-списки, наткнулся на тему модель-представление и очень мало чего понял. Так ли эта тема...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dondublon
Заблокирован
05.01.2017, 12:53     Модель строк с иконками #2
За это отвечает data() c обработкой role=Qt::DecorationRole.

Добавлено через 16 секунд
Сорри за смайлик, оно само. DecorationRole.

 Комментарий модератора 
Правила именования тем и оформления сообщений в разделе Qt
Байт
Эксперт C
15635 / 9977 / 1499
Регистрация: 24.12.2010
Сообщений: 18,726
05.01.2017, 13:24     Модель строк с иконками #3
Цитата Сообщение от dondublon Посмотреть сообщение
Сорри за смайлик, оно само.
Есть такой флажок в ответе - Отключать смайлы
Qt::DecorationRole.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,269
Записей в блоге: 17
05.01.2017, 13:29     Модель строк с иконками #4
Есть QStandardItemModel + QStandardItem

Отображение иконок в несколько колонок
Nell_core
3 / 3 / 1
Регистрация: 19.08.2016
Сообщений: 90
05.01.2017, 17:08  [ТС]     Модель строк с иконками #5
Цитата Сообщение от dondublon Посмотреть сообщение
За это отвечает data() c обработкой role=Qt:ecorationRole.
Тогда возникает необходимось вернуть картинку в виде QVariant. Как это проделать?

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Есть QStandardItemModel + QStandardItem
У QStandardItemModel такой же метод data, который возвращает QVariant.
dondublon
Заблокирован
05.01.2017, 18:07     Модель строк с иконками #6
Цитата Сообщение от Nell_core Посмотреть сообщение
Тогда возникает необходимось вернуть картинку в виде QVariant. Как это проделать?
Не знаю Работал с Qt на Питоне.

Добавлено через 5 минут
Дока гласит:
The inverse conversion (e.g., from QColor to QVariant) is automatic for all data types supported by QVariant, including GUI-related types:
C++ (Qt)
1
2
QColor color = palette().background().color();
QVariant variant = color;
http://doc.qt.io/qt-4.8/qvariant.htm...e-on-gui-types
Maxim Prishchepa
Эксперт С++
1920 / 1032 / 74
Регистрация: 29.03.2010
Сообщений: 3,167
05.01.2017, 18:15     Модель строк с иконками #7
Цитата Сообщение от Nell_core Посмотреть сообщение
Тогда возникает необходимось вернуть картинку в виде QVariant. Как это проделать?
храните там или путь к картинке на фс или в ресурсах, или
C++ (Qt)
1
QPixmap pixmap = variant.value<QPixmap>();
если вы все же решили хранить именно копии изображений в дате...
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,269
Записей в блоге: 17
05.01.2017, 18:48     Модель строк с иконками #8
Цитата Сообщение от Nell_core Посмотреть сообщение
У QStandardItemModel такой же метод data, который возвращает QVariant.
QStandardItemModel это стандартная готовая модель- автоматически подхватывается, работает, отображается ничего своего по коду в принципе писать не нужно.

В общем смотрите пример моего кода.

Добавлено через 4 минуты

Не по теме:

Maxim Prishchepa, Там скорее всего QIcon

Nell_core
3 / 3 / 1
Регистрация: 19.08.2016
Сообщений: 90
05.01.2017, 19:35  [ТС]     Модель строк с иконками #9
Цитата Сообщение от Maxim Prishchepa Посмотреть сообщение
храните там или путь к картинке
Вот всё равно не получается. Сделал так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#ifndef MODEL_H
#define MODEL_H
 
#include <QAbstractListModel>
#include <QStringList>
 
struct element
{
    QString name;
    QString icon;
};
 
class Model : public QAbstractListModel
{
    Q_OBJECT
public:
    explicit Model(QObject *parent = 0);
 
    int rowCount(const QModelIndex &) const;
 
    QVariant data(const QModelIndex &index, int role) const;
 
    bool setData(const QModelIndex &index, const QVariant &value, int role);
 
    Qt::ItemFlags flags(const QModelIndex &index) const;
 
    void addItem(QString name, QString icon);
 
    void delItem(int row);
    
signals:
    
public slots:
 
private:
    QList<element> lst;
};
 
#endif // MODEL_H
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "model.h"
 
Model::Model(QObject *parent) : QAbstractListModel(parent) {}
 
int Model::rowCount(const QModelIndex &) const { return lst.count(); }
 
QVariant Model::data(const QModelIndex &index, int role) const
{
    if (index.isValid())
    {
        switch (role) {
        case Qt::DisplayRole:
            return lst.at(index.row()).name;
        case Qt::DecorationRole:
            return lst.at(index.row()).icon;
        case Qt::ToolTipRole:
            return "this is tooltip";
        default:
            return QVariant();
        }
    }
    return QVariant();
}
 
bool Model::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (role == Qt::EditRole)
    {
        lst[index.row()].name = value.toString();
        return true;
    }
    return false;
}
 
Qt::ItemFlags Model::flags(const QModelIndex &index) const { return index.flags(); }
 
void Model::addItem(QString name, QString icon)
{
    element item;
 
    item.name = name;
    item.icon = icon;
 
    lst.append(item);
}
 
void Model::delItem(int row) { if (lst.count() > row) lst.removeAt(row); }
Запилил интерфейс с QListView и возможностью добавлять элементы (вызовом публичной функции addItem). Так вот при добавлении, во-первых, ничего не отображается на представлении, а во-вторых, программа крашится с шансом 50%.

P.S. Код интерфейса решил не скидывать, потому что ошибка, вероятно, в модели. Если общественность придёт к выводу, что с моделью порядок, то скину код интерфейса.
Maxim Prishchepa
Эксперт С++
1920 / 1032 / 74
Регистрация: 29.03.2010
Сообщений: 3,167
05.01.2017, 19:39     Модель строк с иконками #10
это косяк в отображении с 99.9% вероятностью, ну хотя можно рассматривать, что и с моделью... в общем:
тут тупо ломаться нечему... у вас я так понял нет согласования между моделью и отображением...

скорее всего вьюшка ожидает что-то "свое", а модель ей возвращает что-то "другое-свое". Вот и не работет...
Nell_core
3 / 3 / 1
Регистрация: 19.08.2016
Сообщений: 90
05.01.2017, 20:11  [ТС]     Модель строк с иконками #11
Цитата Сообщение от Avazart Посмотреть сообщение
QStandardItemModel это стандартная готовая модель
Попробовал - получилось. Спасибо. Но мне, всё же, интересно, почему моё наследование того же QAbstractListModel не работает.
Maxim Prishchepa
Эксперт С++
1920 / 1032 / 74
Регистрация: 29.03.2010
Сообщений: 3,167
05.01.2017, 20:17     Модель строк с иконками #12
Цитата Сообщение от Nell_core Посмотреть сообщение
почему моё наследование того же QAbstractListModel не работает.
Цитата Сообщение от Maxim Prishchepa Посмотреть сообщение
скорее всего вьюшка ожидает что-то "свое", а модель ей возвращает что-то "другое-свое". Вот и не работет...
как-то так :-)
Nell_core
3 / 3 / 1
Регистрация: 19.08.2016
Сообщений: 90
05.01.2017, 20:19  [ТС]     Модель строк с иконками #13
Цитата Сообщение от Maxim Prishchepa Посмотреть сообщение
тут тупо ломаться нечему
Хорошо. Тогда скидываю код отображения. У меня настойчивое ощущение, что там тоже тупо ломаться нечему, взгляните, пожалуйста)

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QtWidgets>
#include "model.h"
 
class Widget : public QWidget
{
    Q_OBJECT
    
public:
    Widget(QWidget *parent = 0);
 
private:
    Model *model;
    QSortFilterProxyModel *proxy;
 
    QListView *listView1;
    QListView *listView2;
 
    QLineEdit *add;
    QLineEdit *mask;
 
    QPushButton *del;
 
private slots:
    void slotAddReturnClicked();
};
 
#endif // WIDGET_H
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "widget.h"
#include <QFileDialog>
 
Widget::Widget(QWidget *parent) : QWidget(parent)
{
    listView1 = new QListView;
    listView2 = new QListView;
 
    model = new Model(this);
    proxy = new QSortFilterProxyModel(this);
 
    add = new QLineEdit;
    mask = new QLineEdit;
 
    QLabel *lblAdd = new QLabel("&Добавить:");
    QLabel *lblMask = new QLabel("&Маска:");
 
    lblAdd->setBuddy(add);
    lblMask->setBuddy(mask);
 
    del = new QPushButton("Удалить");
 
    listView1->setModel(model);
    listView1->setViewMode(QListView::IconMode);
 
    proxy->setSourceModel(model);
    listView2->setModel(proxy);
 
    listView1->setIconSize(QSize(50, 50));
    listView2->setIconSize(QSize(50, 50));
 
    connect(add, SIGNAL(returnPressed()), SLOT(slotAddReturnClicked()));
 
    QVBoxLayout *vbl = new QVBoxLayout;
 
    vbl->addWidget(lblAdd);
    vbl->addWidget(add);
    vbl->addWidget(del);
    vbl->addWidget(lblMask);
    vbl->addWidget(mask);
    vbl->addWidget(listView2, 1);
 
    QHBoxLayout *hbl = new QHBoxLayout;
 
    hbl->addWidget(listView1, 1);
    hbl->addLayout(vbl);
 
    setLayout(hbl);
    setMinimumSize(600, 400);
}
 
void Widget::slotAddReturnClicked()
{
    QString name = add->text();
 
    if (!name.isEmpty())
    {
        QString icon = QFileDialog::getOpenFileName(this, "Откройте изображение");
        QPixmap pic(icon);
        
        if (!pic.isNull()) model->addItem(name, icon);
        add->clear();
    }
}
Добавлено через 1 минуту
Цитата Сообщение от Maxim Prishchepa Посмотреть сообщение
вьюшка ожидает что-то "свое"
Насколько я понимаю, вьюшка человек простой и много не ожидает. Всё, что хочет ожидать, спрашивает методами data, rowCount и flags.
Байт
Эксперт C
15635 / 9977 / 1499
Регистрация: 24.12.2010
Сообщений: 18,726
05.01.2017, 22:03     Модель строк с иконками #14
Цитата Сообщение от Nell_core Посмотреть сообщение
Насколько я понимаю,
Проблема не стоит выеденного яйца. Просто хочется не яйцо покушать. а немножко побазарить.
Nell_core
3 / 3 / 1
Регистрация: 19.08.2016
Сообщений: 90
05.01.2017, 22:05  [ТС]     Модель строк с иконками #15
Цитата Сообщение от Байт Посмотреть сообщение
Проблема не стоит выеденного яйца. Просто хочется не яйцо покушать. а немножко побазарить.
Так как же решить эту проблему?
Байт
Эксперт C
15635 / 9977 / 1499
Регистрация: 24.12.2010
Сообщений: 18,726
05.01.2017, 22:15     Модель строк с иконками #16
Цитата Сообщение от Nell_core Посмотреть сообщение
Так как же решить эту проблему?
Легко. Попробовать решить ее своей головой. Забыв про всю ... ню, которую тут тебе написали. Если не получится - приходи опять. Но может быть тогда твой вопрос будет немножко пооссмысленней
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,269
Записей в блоге: 17
05.01.2017, 22:22     Модель строк с иконками #17
Цитата Сообщение от Байт Посмотреть сообщение
Если не получится - приходи опять
Или вообще не приходи, а то такое впечатление что всем поприколу нянчится с человеком которому лень прочитать книгу какию нибудь по Qt МVС что бы все стало на свои места и не было непонятных вопросов.
Nell_core
3 / 3 / 1
Регистрация: 19.08.2016
Сообщений: 90
05.01.2017, 23:10  [ТС]     Модель строк с иконками #18
Палехче, парни, у меня от траллирования очень серьёзная защита.

Цитата Сообщение от Байт Посмотреть сообщение
Легко. Попробовать решить ее своей головой. Забыв про всю ... ню, которую тут тебе написали. Если не получится - приходи опять. Но может быть тогда твой вопрос будет немножко пооссмысленней
Мой вопрос столь осмысленный именно потому, что уже несколько дней я пытаюсь его решить и знаю, какие конкретно проблемы он вызывает.

Цитата Сообщение от Avazart Посмотреть сообщение
Или вообще не приходи, а то такое впечатление что всем поприколу нянчится с человеком которому лень прочитать книгу какию нибудь по Qt МVС что бы все стало на свои места и не было непонятных вопросов.
Вот с этого и надо было начинать. Какую прочитать книгу?
Байт
05.01.2017, 23:22
  #19

Не по теме:

Нету двух конца. Глупости людской и милосердию Божьему

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2017, 12:08     Модель строк с иконками
Еще ссылки по теме:

модель\представление - C++ Qt
Добрый день. Возникла необходимость познакомится с архитектурой модель\представление. В сети очень много информации и из-за этого возникла...

модель\представление - C++ Qt
Здравствуйте, есть ряд вопросов по архитектуре модель\представление. Читаю http://qtdocs.narod.ru/, раздел создание новых моделей... ...

QTableView не отображаем модель. - C++ Qt
Здравствуйте, уже замучился со своей недалекостью.. реализую модель - представление.. так вот, вопрос тупой до безобразия.. почему...

Модель движения ног - C++ Qt
Добрый день. Пытаюсь нарисовать низ скелета человека и задавая углы на главной форме собственно перерисовывать. В целом получилось это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Avazart
06.01.2017, 12:08     Модель строк с иконками
  #20

Не по теме:

Цитата Сообщение от Nell_core Посмотреть сообщение
Вот с этого и надо было начинать.
Так кто вам виноват что вы начали с глупых вопросов а не с книг?
Цитата Сообщение от Nell_core Посмотреть сообщение
Какую прочитать книгу?
О вреде алкоголя и наркотиков вероятно...

Yandex
Объявления
06.01.2017, 12:08     Модель строк с иконками
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru