В эти дни я сталкиваюсь с проблемой QT.
Есть пакетные данные, которые я хочу показать в моем приложении qt с QTableview (не qml gridview, так как мое приложение использует виджеты). Каждый элемент данных включает в себя изображение и имя изображения. Мне нужно, чтобы изображение отображалось на qlabel, а его имя отображалось на другом qlabel. Эти два виджета должны быть показаны на моей определенной рамке. И тогда я позволю отображаемому пользователем кадру отображаться в каждой ячейке QTableView.
Из BigBourin (который также задает аналогичный вопрос) я знаю, что должен реализовать самоопределяемый делегат и переопределить функцию Painter, вот так:
void PackageListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
// here we have active painter provided by caller
// by the way - we can't use painter->save() and painter->restore()
// methods cause we have to call painter->end() method before painting
// the QWidget, and painter->end() method deletes
// the saved parameters of painter
// we have to save paint device of the provided painter to restore the painter
// after drawing QWidget
QPaintDevice* original_pdev_ptr = painter->device();
// example of simple drawing (selection) before widget
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
// creating local QWidget (that's why i think it should be fasted, cause we
// don't touch the heap and don't deal with a QWidget except painting)
PackageListItemWidget item_widget;
// Setting some parameters for widget for example
// spec. params
item_widget.SetPackageName(index.data(Qt::DisplayRole).toString());
// geometry
item_widget.setGeometry(option.rect);
// here we have to finish the painting of provided painter, cause
// 1) QWidget::render(QPainter *,...) doesn't work with provided external painter
// and we have to use QWidget::render(QPaintDevice *,...)
// which creates its own painter
// 2) two painters can't work with the same QPaintDevice at the same time
painter->end();
// rendering of QWidget itself
item_widget.render(painter->device(), QPoint(option.rect.x(), option.rect.y()), QRegion(0, 0, option.rect.width(), option.rect.height()), QWidget::RenderFlag::DrawChildren);
// starting (in fact just continuing) painting with external painter, provided
// by caller
painter->begin(original_pdev_ptr);
// example of simple painting after widget
painter->drawEllipse(0,0, 10,10);
};
у меня вопрос item_widget.SetPackageName (index.data (Qt :: DisplayRole) .toString ());
данные откуда? данные могут быть пользовательским классом данных?
Задача ещё не решена.
Других решений пока нет …