Как я могу применить глобальный стиль QListView к QListWidget, который использует QAbstractItemDelegate для настраиваемого отображения элемента? - PullRequest
1 голос
/ 09 ноября 2011

Я успешно создал QListWidget, который отображает 2 строки текста для каждого элемента, используя этот код (адаптированный из этого примера ):

SessionListDelegate.h

#ifndef SESSIONLISTDELEGATE_H_
#define SESSIONLISTDELEGATE_H_

#include <QPainter>
#include <QAbstractItemDelegate>

class SessionListDelegate : public QAbstractItemDelegate
{
public:
    SessionListDelegate(QObject *parent = 0, QStyle *style);
    virtual ~SessionListDelegate();

    void paint (QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;
    QSize sizeHint (const QStyleOptionViewItem & option, const QModelIndex & index) const;
private:
};

#endif /* SESSIONLISTDELEGATE_H_ */

SessionListDelegate.cpp

#include "SessionListDelegate.h"

SessionListDelegate::SessionListDelegate(QObject *parent)
: QAbstractItemDelegate(parent)
{
    this->_parent = parent;
}

void SessionListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
    QRect r = option.rect;

    QPen fontPen(QColor::fromRgb(51,51,51), 1, Qt::SolidLine);

    if(option.state & QStyle::State_Selected)
    {
        painter->fillRect(option.rect, option.palette.color(QPalette::Highlight));
    }
    painter->setPen(fontPen);

    QString date = index.data(Qt::DisplayRole).toString();
    QString description = index.data(Qt::UserRole).toString();

    int imageSpace = 10;

    r = option.rect.adjusted(imageSpace, 0, -10, -30);
    painter->setFont(QFont( "Lucida Grande", 24, QFont::Normal));
    painter->drawText(r.left(), r.top(), r.width(), r.height(), Qt::AlignBottom|Qt::AlignLeft, date, &r);

    r = option.rect.adjusted(imageSpace, 30, -10, 0);
    painter->setFont(QFont( "Lucida Grande", 18, QFont::Normal));
    painter->drawText(r.left(), r.top(), r.width(), r.height(), Qt::AlignLeft, description, &r);

}

QSize SessionListDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const
{
   return QSize(200, 60); // very dumb value
}

SessionListDelegate::~SessionListDelegate()
{
    // TODO Auto-generated destructor stub
}

Код вызова в mainapp.cpp:

ui.myList->setItemDelegate(new SessionListDelegate(ui.myList));

Теперь в основной форме QWidget пользовательского интерфейса приложения я определил таблицу стилей, которая содержитстиль для всех QListViews для формы:

QListView::item:selected {
color: black;
background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(255, 255, 80, 255), stop:1 rgba(255, 255, 255, 255));
}

Я хотел бы применить этот стиль к настроенному ListWidget, но я не могу придумать, как это сделать.Кажется, это должно быть довольно распространенным делом, но я нигде не могу найти примеров.

1 Ответ

2 голосов
/ 09 ноября 2011

Я думаю, вы должны наследовать от QStyledItemDelegate вместо QAbstractItemDelegate. Из документации Qt:

Начиная с Qt 4.4, есть два класса делегатов: QItemDelegate и QStyledItemDelegate. Тем не менее, делегат по умолчанию QStyledItemDelegate. Эти два класса являются независимыми альтернативами рисование и предоставление редакторов для предметов в представлениях. Различия между ними есть то, что QStyledItemDelegate использует текущий стиль для раскрась свои предметы. Поэтому мы рекомендуем использовать QStyledItemDelegate как базовый класс при реализации пользовательских делегатов или при работе с Таблица стилей Qt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...