Как создать представления списка стилей Symbian в Qt - PullRequest
1 голос
/ 08 мая 2011

Я никогда раньше не делал никаких делегатов элементов в Qt, и я думаю, что документация плохо объясняет более сложные делегаты.

Мне нужно создать 2 стиля списков стилей Symbian (^ 3)

Тип 1:

Delegate style 1

Это для общих списков навигации, значок и нижняя метка являются необязательными.

Тип 2:

Delegate style 2

Это для списков настроек, где кнопка может быть кнопкой переключения (вкл / выкл) или выполнять контекстное меню и т. Д.

Как бы я продолжал создавать такого рода делегаты элементов?

С наилучшими пожеланиями, Крыса

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Я должен был сделать что-то подобное один раз.Вот как я это сделал.

Моя декларация класса делегата.Как вы можете видеть, он имеет метку члена: QLabel *.Вы можете добавить другой ярлык или кнопку, в зависимости от ваших потребностей.

class MyItemDelegate : public QStyledItemDelegate
{
public:
    explicit MyItemDelegate(QObject *parent = 0);
    ~MyItemDelegate();
protected:
    void paint(QPainter *painter,
               const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QSize sizeHint(const QStyleOptionViewItem &option,
                   const QModelIndex &index) const;
private:
    QLabel *label;
};

Мои методы paint () и sizeHint ().

QSize MyItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(!index.isValid())
        return QSize();
    QVariant data = index.data(Qt::DisplayRole);

    label->setText(data.toString());
    label->resize(label->sizeHint());
    QSize size(option.rect.width(), label->height());
    return size;
}

void MyItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(!index.isValid())
        return;
    QVariant data = index.data(Qt::DisplayRole);

    // Not necessary to do it here, as it's been already done in sizeHint(), but anyway.
    label->setText(data.toString());

    painter->save();

    QRect rect = option.rect;

    // This will draw a label for you. You can draw a pushbutton the same way.
    label->render(painter, QPoint(rect.topLeft().x(), rect.center().y() - label->height() / 2),
                  QRegion(label->rect()), QWidget::RenderFlags());

    painter->restore();
}

Надеюсь, что вы уже былинаходясь в поиске.Удачи!

0 голосов
/ 08 мая 2011

У вас есть 2 варианта,

1) QML - это, на мой взгляд, лучший способ пойти и легче достичь того, что вы пытаетесь сделать. Ссылка на пример

Здесь показано, как использовать делегат для просмотра списка.

2) QItemDelegate - подкласс QItemDelegate, а затем назначьте этот делегат для просмотра списка, Ссылка на QItemDelegate

...