如何在QLIstWidgetItem中的文本左侧设置图标?

时间:2019-06-16 08:46:20

标签: qt qlistwidget qlistwidgetitem

我有一个QListWidget,它在iconMode中用作viewMode。当我设置QIcon和QListWidgetItem的文本时,图标显示在文本上方。如果我将listMode中的QlistWidget用作viewMode,则图标会显示在文本的左侧。当QListWidget处于iconMode时,如何在文本的左侧显示图标?

我为QLIstWidgetItems尝试了setTextAlignment(Qt :: AlignRight)。但这没用。

1 个答案:

答案 0 :(得分:1)

QStyleOptionViewItem的decorationPosition属性确定图标的位置,因此解决方案是修改这些属性:

  • 重写QListWidget的viewOptions()方法:
#include <QtWidgets>

class ListWidget: public QListWidget
{
public:
    using QListWidget::QListWidget;
protected:
    QStyleOptionViewItem viewOptions() const override{
        QStyleOptionViewItem option = QListWidget::viewOptions();
        option.decorationPosition = QStyleOptionViewItem::Left;
        return option;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ListWidget w;
    w.setViewMode(QListView::IconMode);
    for (QStyle::StandardPixmap sp: {
         QStyle::SP_ArrowBack,
         QStyle::SP_ArrowDown,
         QStyle::SP_ArrowForward,
         QStyle::SP_ArrowLeft,
         QStyle::SP_ArrowRight,
         QStyle::SP_ArrowUp})
    {
        QIcon icon = QApplication::style()->standardPixmap(sp);
        QListWidgetItem *it = new QListWidgetItem("foo");
        it->setIcon(icon);
        w.addItem(it);
    }
    w.show();
    return a.exec();
}
  • 重写QStyledItemDelegate的initStyleOption()方法
#include <QtWidgets>

class StyledItemDelegate: public QStyledItemDelegate
{
public:
    using QStyledItemDelegate::QStyledItemDelegate;
protected:
    void initStyleOption(QStyleOptionViewItem *option,
                         const QModelIndex &index) const override
    {
        QStyledItemDelegate::initStyleOption(option, index);
        option->decorationPosition = QStyleOptionViewItem::Left;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QListWidget w;
    w.setViewMode(QListView::IconMode);
    StyledItemDelegate *delegate = new StyledItemDelegate(&w);
    w.setItemDelegate(delegate);
    for (QStyle::StandardPixmap sp: {
         QStyle::SP_ArrowBack,
         QStyle::SP_ArrowDown,
         QStyle::SP_ArrowForward,
         QStyle::SP_ArrowLeft,
         QStyle::SP_ArrowRight,
         QStyle::SP_ArrowUp})
    {
        QIcon icon = QApplication::style()->standardPixmap(sp);
        QListWidgetItem *it = new QListWidgetItem("foo");
        it->setIcon(icon);
        w.addItem(it);
    }
    w.show();
    return a.exec();
}

enter image description here