1

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

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

类型 1:

代表作风1

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

类型 2:

代表作风2

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

我将如何继续创建此类项目代表?

最好的问候,老鼠

4

2 回答 2

2

我不得不做一次类似的东西。我就是这样做的。

我的委托类声明。如您所见,它有一个成员:QLabel *label。您可以根据需要添加另一个标签或按钮。

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();
}

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

于 2011-05-10T22:46:20.533 回答
0

你有2个选择,

1) QML - 在我看来,这是最好的方法,并且更容易实现你想要做的事情。 链接到示例

这向您展示了如何将委托用于列表视图。

2)QItemDelegate - 子类 QItemDelegate 然后将这个委托分配给一个列表视图, 链接到 QItemDelegate

于 2011-05-08T18:20:05.343 回答