Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследник QListView с виджетами внутри [Qt] 
:(
    Опции темы
declonter
Дата 9.8.2017, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 10.2.2016

Репутация: нет
Всего: нет



Хочу виджет, в который можно добавлять другие виджеты, чтобы они располагались слева на право, а если места не хватает, то ниже слева  (построчно). Делаю наследника от QListView, виджеты храню в QStandardItemModel, виджеты пытаюсь отрисовать делегатом.

Для теста в окне кладу QGridLayout и бросаю в него виджет. Выглядит это ужасно.

user posted image

Что делаю не так и как исправить?
Заголовочный файл:
Код

#ifndef QMYLISTWIDGET_HPP
#define QMYLISTWIDGET_HPP

#include <QtCore>
#include <QtWidgets>

class QMyListWidget: public QListView{
    Q_OBJECT
    private:
        class C_WidgetDelegate : public QStyledItemDelegate{
            public:
                C_WidgetDelegate();

                void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
                QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;

            public:
                virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
                virtual void destroyEditor(QWidget *editor, const QModelIndex &index) const;
        };
        C_WidgetDelegate    delegate;
        QStandardItemModel  model;
        QListView           *view;

    public:
        void showEvent(QShowEvent *event);
        void resizeEvent(QResizeEvent *event);
        int WidgetCount() const;
        void AddWidget(QWidget*);
        QWidget* GetWidget(int);
        QWidget* TakeWidget(int);
        QMyListWidget(QWidget* parent = Q_NULLPTR);
};

#endif


Реализация:
Код

#include "qmylistwidget.hpp"

void QMyListWidget::showEvent(QShowEvent *event){
    view->doItemsLayout();
}
void QMyListWidget::resizeEvent(QResizeEvent *event){
    view->doItemsLayout();
}
int QMyListWidget::WidgetCount() const {
    return (model.rowCount());
}
void QMyListWidget::AddWidget(QWidget * w){
    int row = model.rowCount();
    do {
        if (0 == w)
            break;
        w->hide();
        w->setParent(this);
        if (0 == model.columnCount())
            model.insertColumn(0);
        model.insertRow(row);
        model.setData(model.index(row,0), QVariant::fromValue(w), Qt::UserRole);
    } while (false);
}
QWidget *QMyListWidget::GetWidget(int index){
    QWidget * res = 0;
    do {
        if (index<0)
            break;
        if (index>=WidgetCount())
            break;
        res = model.data(model.index(index, 0)).value<QWidget*>();
    } while (false);
    return (res);
}
QWidget *QMyListWidget::TakeWidget(int index){
    QWidget * res = GetWidget(index);
    do {
        if (0 == res)
            break;
        model.removeRow(index);
    } while (false);
    return (res);
}
QMyListWidget::QMyListWidget(QWidget *parent):QListView(parent){
    view = this;
    view->setModel(&model);
    view->setItemDelegate(&delegate);
    view->setViewMode(QListView::IconMode);
    view->setMovement(QListView::Static);
}

// DELEGATE

QMyListWidget::C_WidgetDelegate::C_WidgetDelegate(){
}
void QMyListWidget::C_WidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const{
    QWidget * widget = index.data(Qt::UserRole).value<QWidget*>();
    widget->render(painter, option.rect.topLeft());
    widget->setGeometry(option.rect);
}
QSize QMyListWidget::C_WidgetDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const{
    QWidget * widget = index.data(Qt::UserRole).value<QWidget*>();
    return (widget->sizeHint());
    (void)option;
}
QWidget *QMyListWidget::C_WidgetDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{
    QWidget *w = index.data(Qt::UserRole).value<QWidget*>();
    w->show();
    return (w);
    (void)parent;
    (void)option;
}
void QMyListWidget::C_WidgetDelegate::destroyEditor(QWidget *editor, const QModelIndex &index) const{
    editor->hide();
    (void)index;
}




PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1081 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.