Я успешно создал 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, но я не могу придумать, как это сделать.Кажется, это должно быть довольно распространенным делом, но я нигде не могу найти примеров.