我在QIcon
中显示了一些QString
和QListview
对。整个事情已经使用Qt模型/视图编程设置。
我在此QListView
中显示带标签的图标。使用IconMode
,Snap
和TopToBottom
标记显示项目。因此,这些被组织成一个网格。
我想垂直排列所有QListView
项并居中。为了做到这一点,我将QStyledItemDelegate
对象子类化,并重载了paint方法。但是,我有三个主要问题:
QStyledItemDelegate
子类中),并在原始位置显示虚线方框。setGridSize
,也会将所有内容渲染为网格。我只想使用一个"列"。这是一段代码:
QListView
的构造函数的摘录:setViewMode(QListView::IconMode); setMovement(QListView::Snap); setFlow(QListView::TopToBottom); setSpacing(5); setIconSize(QSize(iconSize, iconSize)); setGridSize(QSize(iconSize + 10, iconSize + 10)); setDragEnabled(true); setAcceptDrops(true); setDropIndicatorShown(true);
QStyledItemDelegate
:void FramesStyledItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { QStyleOptionViewItemV4 opt = option; //initStyleOption(&opt, index); opt.icon = QIcon(); opt.text = QString(); QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter); const QRect r = option.rect; QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole)); QString string = qvariant_cast<QString>(index.data(Qt::DisplayRole)); QPixmap pix = icon.pixmap(r.size()); const QPoint p = QPoint((r.width() - pix.width())/2, (r.height() - pix.height())/2); painter->drawPixmap(r.topLeft() + p, pix); painter->drawText(r.center() + p + QPoint(-(string.count() / 2), r.height() / 2), string); }
如果我不使用上面显示的initStyleOption
,我可以删除
虚线方形,但我丢失了所有默认样式。
如果我取消注释initStyleOption
,则会出现虚线方框。我也失去了所有默认样式。
以下是一些截图:
光标位于第0项(无悬停装饰,无选择装饰)。
已选择项目0。出现一个小方框(initStyleOption
已取消注释)。
我已切换到ListMode
。选择装饰工作但不悬停。同样,标签的原始位置会出现一个小的虚线方块。
有人有想法吗?谢谢你的回答。