C++ QListView上的Qt5 QStyledItemDelegate将删除所有默认样式

C++ QListView上的Qt5 QStyledItemDelegate将删除所有默认样式,c++,qt5,qstyleditemdelegate,C++,Qt5,Qstyleditemdelegate,我在QListview中显示了一些QIcon和QString对。整个过程都是使用Qt模型/视图编程设置的 我正在该QListView中显示带标签的图标。使用IconMode、Snap和TopToBottom标志显示项目。因此,这些被组织成一个网格 我想将所有QListView项目垂直居中布局。为此,我对QStyledItemDelegate对象进行了子类化,并重载了paint方法。然而,我有三个主要问题: 图标标签已被移动(在QStyledItemDelegate子类中),并在其原始位置显示一个

我在
QListview
中显示了一些
QIcon
QString
对。整个过程都是使用Qt模型/视图编程设置的

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

我想将所有
QListView
项目垂直居中布局。为此,我对
QStyledItemDelegate
对象进行了子类化,并重载了paint方法。然而,我有三个主要问题:

  • 图标标签已被移动(在
    QStyledItemDelegate
    子类中),并在其原始位置显示一个虚线方块
  • 所有默认样式都已消失(悬停、选择)。我知道如何再次添加一些,但我想使用默认的(Windows样式)
  • 即使未调用
    setGridSize
    ,所有内容都会渲染到网格中。我只想使用一个“列”
  • 下面是一段代码:

    • 我的自定义
      QListView
      的构造函数摘要:
    • QStyledItemDelegate
      的绘制方法:
    void FramesStyledItemDelegate::paint(qPaint*painter,常量qStyleOption视图项和选项,常量QModelIndex和索引)常量
    {
    QStyleOptionViewItemV4 opt=选项;
    //initStyleOption(&opt,index);
    opt.icon=QIcon();
    opt.text=QString();
    QApplication::style()->drawControl(QStyle::CE_ItemViewItem,&opt,painter);
    const QRect r=option.rect;
    QIcon=qvariant_cast(index.data(Qt::DecorationRole));
    QString=qvariant_cast(index.data(Qt::DisplayRole));
    QPixmap pix=icon.pixmap(r.size());
    常数QPoint p=QPoint((r.width()-pix.width())/2,(r.height()-pix.height())/2);
    painter->drawPixmap(r.topLeft()+p,pix);
    画师->绘图文本(r.center()+p+QPoint(-(string.count()/2),r.height()/2),字符串);
    }
    
    • 如果我不使用上面显示的
      initStyleOption
      ,我可以删除 虚线正方形,但我丢失了所有默认样式

    • 如果我取消注释
      initStyleOption
      ,则会出现虚线方块。我也会丢失所有默认样式

    以下是一些屏幕截图:

    光标位于项目0上(无悬停装饰,无选择装饰)

    已选择项目0。此时会出现一个小的虚线方块(
    initStyleOption
    已取消注释)

    我已切换到
    列表模式
    。选择装饰正在工作,但未悬停。同样,标签的原始位置会出现一个小的点正方形

    有人有主意吗?谢谢你的回答

    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);
    
    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);
    }