如何在Qt中创建Symbian样式列表视图

时间:2011-05-08 07:26:34

标签: qt user-interface symbian qlistwidget qitemdelegate

我之前从未在Qt中做过任何项目委托,我认为文档没有很好地解释更复杂的委托。

我需要创建2种样式的Symbian(^ 3)样式列表

类型1:

Delegate style 1

这适用于常见的导航列表,图标和下标签是可选的。

类型2:

Delegate style 2

这适用于设置列表,其中按钮可以是切换(打开/关闭)按钮或执行上下文菜单等。

我将如何继续创建这类商品代表?

最诚挚的问候, 鼠

2 个答案:

答案 0 :(得分:2)

我必须做一次类似的事情。这就是我做到的。

我的委托类声明。如您所见,它有一个成员: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();
}

希望这是你一直在寻找的东西。祝你好运!

答案 1 :(得分:0)

您有2个选项,

1)QML - 在我看来,这是最好的方式,更容易实现你想要做的事情。 Link to Example

这将向您展示如何使用Delegate作为列表视图。

2)QItemDelegate - 子类QItemDelegate然后将此委托分配给listview, Link to QItemDelegate