我有一些QIcon
和QString
对显示在一个QListview
. 整个事情都是使用 Qt 模型/视图编程设置的。
我在这个中显示带标签的图标QListView
。项目使用IconMode
,Snap
和TopToBottom
标志显示。因此,这些被组织成一个网格。
我想QListView
垂直和居中布局所有项目。为了做到这一点,我对QStyledItemDelegate
对象进行了子类化,并重载了paint方法。但是,我有三个主要问题:
- 图标标签已被移动(在
QStyledItemDelegate
子类中),并且在其原始位置出现了一个虚线方块。 - 所有默认样式都消失了(悬停,选择)。我知道如何再次添加一些,但我想使用默认的(Windows 样式)。
- 一切都被渲染成一个网格,即使
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
. 选择装饰工作但不悬停。同样,标签的原始位置出现一个小虚线方块。
有人有想法吗?感谢您的回答。