Как установить стиль первого / последнего элемента QListWidget? - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу реализовать следующий эффект в QListWidget :

enter image description here

К сожалению, QListWidget::item:first втаблица стилей QListWidget .

Есть ли что-то вроде селектора брата css li~li в qss?

Я рассмотрел пример Qt Style , но информации для меня недостаточно.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Причина

QListView , соотв. QListWidget действительно не поддерживает ::item:first, поэтому вы не можете достичь желаемого с помощью таблиц стилей.

Решение

Вместо него можно использовать делегата.,Подкласс QStyledItemDelegate , переопределение QAbstractItemDelegate :: paint и QAbstractItemDelegate :: sizeHint и настройте их по своему вкусу.

Пример

Вот пример того, как это решение может быть реализовано:

  1. Создать класс Delegate : public QStyledItemDelegate

В Delegate.cpp :

void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    int b = option.rect.bottom() - 1;

    painter->save();
    painter->setClipping(true);
    painter->setClipRect(option.rect);

    if (index.row() < index.model()->rowCount() - 1)
        painter->drawLine(option.rect.left() + 5, b, option.rect.right() - 5, b);

    painter->restore();

    QStyledItemDelegate::paint(painter, option, index);
}

QSize Delegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QSize sz(QStyledItemDelegate::sizeHint(option, index));

    sz.setHeight(32);

    return sz;
}
Тестирование класса в приложении виджетов Qt

В MainWindow.cpp :

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    auto *list = new QListWidget(this);

    list->addItems(QStringList{"1", "2", "3", "4", "5", "6"});
    list->setItemDelegate(new Delegate(this));
    list->setFrameStyle(QFrame::NoFrame);

    setCentralWidget(list);
    setContentsMargins(9, 9, 9, 9);
    resize(200, 300);
}

Результат

Приведенный примервыдает следующий результат:

Window with QListWidget containing 6 items separated by a line

0 голосов
/ 12 сентября 2018

Взгляните на справочник стилей для обзора стилей, специфичных для виджетов.

...