1

我有一些QIconQString对显示在一个QListview. 整个事情都是使用 Qt 模型/视图编程设置的。

我在这个中显示带标签的图标QListView。项目使用IconMode,SnapTopToBottom标志显示。因此,这些被组织成一个网格。

我想QListView垂直和居中布局所有项目。为了做到这一点,我对QStyledItemDelegate对象进行了子类化,并重载了paint方法。但是,我有三个主要问题:

  1. 图标标签已被移动(在QStyledItemDelegate子类中),并且在其原始位置出现了一个虚线方块。
  2. 所有默认样式都消失了(悬停,选择)。我知道如何再次添加一些,但我想使用默认的(Windows 样式)。
  3. 一切都被渲染成一个网格,即使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. 选择装饰工作但不悬停。同样,标签的原始位置出现一个小虚线方块。

有人有想法吗?感谢您的回答。

4

0 回答 0