Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Qt中创建Symbian样式列表视图_Qt_User Interface_Symbian_Qlistwidget_Qitemdelegate - Fatal编程技术网

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

如何在Qt中创建Symbian样式列表视图,qt,user-interface,symbian,qlistwidget,qitemdelegate,Qt,User Interface,Symbian,Qlistwidget,Qitemdelegate,我以前从未在Qt中完成过任何项目委托,我认为文档没有很好地解释更复杂的委托 我需要创建2种Symbian(^3)样式列表 类型1: 这适用于常见导航列表,图标和下部标签是可选的 类型2: 这适用于设置列表,其中按钮可以是切换(开/关)-按钮或执行上下文菜单等 我将如何继续创建此类项目代理 致以最良好的祝愿, 老鼠你有两个选择 1) QML-在我看来,这是最好的方法,更容易实现你想要做的事情。 这将向您展示如何为listview使用委托 2) QItemDelegate-子类QItemDel

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

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

类型1:

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

类型2:

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

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

致以最良好的祝愿, 老鼠

你有两个选择

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

这将向您展示如何为listview使用委托

2) QItemDelegate-子类QItemDelegate然后将此委托分配给listview,
我曾经做过类似的东西。我就是这样做的

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


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

QML不是一个选项,因为我想保持一个原生的外观。我知道我需要将QItemDelegate子类化,问题是对于涉及多种类型ui元素的更复杂的委托,没有易于理解的文档。这正是我一直在寻找的!非常感谢。
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();
}