Хочу виджет, в который можно добавлять другие виджеты, чтобы они располагались слева на право, а если места не хватает, то ниже слева (построчно). Делаю наследника от QListView, виджеты храню в QStandardItemModel, виджеты пытаюсь отрисовать делегатом. Для теста в окне кладу QGridLayout и бросаю в него виджет. Выглядит это ужасно. Что делаю не так и как исправить? Заголовочный файл: Код | #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; }
|
|