我之前从未在Qt中做过任何项目委托,我认为文档没有很好地解释更复杂的委托。
我需要创建2种样式的Symbian(^ 3)样式列表
类型1:
这适用于常见的导航列表,图标和下标签是可选的。
类型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