Как установить значок слева от текста в QLIstWidgetItem? - PullRequest
2 голосов
/ 16 июня 2019

У меня есть QListWidget, который используется в iconMode как viewMode.Когда я устанавливаю QIcon и текст для QListWidgetItem, в верхней части текста отображается значок.Если я использую QlistWidget в listMode в качестве viewMode, в левой части текста отображается значок.Как показать значок в левой части текста, когда QListWidget находится в iconMode?

Я пытался установить setTextAlignment (Qt :: AlignRight) для QLIstWidgetItems.Но это не сработало.

1 Ответ

1 голос
/ 16 июня 2019

Свойство ornamentPosition объекта QStyleOptionViewItem определяет положение значка, поэтому решение заключается в изменении этих свойств:

  • Переопределить метод viewOptions () класса QListWidget:
#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();
}
  • Переопределить метод initStyleOption () класса QStyledItemDelegate
#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

...