QtView上的Qt5 QStyledItemDelegate删除了所有默认样式

时间:2016-10-25 05:36:45

标签: c++ qt5 qstyleditemdelegate

我在QIcon中显示了一些QStringQListview对。整个事情已经使用Qt模型/视图编程设置。

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

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

  1. 已移动图标标签(在QStyledItemDelegate子类中),并在原始位置显示虚线方框。
  2. 所有默认样式都消失了(悬停,选择)。我知道如何再添加一些,但我想使用默认的(Windows风格)。
  3. 即使未调用setGridSize,也会将所有内容渲染为网格。我只想使用一个"列"。
  4. 这是一段代码:

    • 我的自定义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,则会出现虚线方框。我也失去了所有默认样式。

    以下是一些截图:

    No decoration

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

    enter image description here

    已选择项目0。出现一个小方框(initStyleOption已取消注释)。

    enter image description here

    我已切换到ListMode。选择装饰工作但不悬停。同样,标签的原始位置会出现一个小的虚线方块。

    有人有想法吗?谢谢你的回答。

0 个答案:

没有答案