首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QStandardItem + QComboBox

QStandardItem + QComboBox
EN

Stack Overflow用户
提问于 2010-06-29 03:28:42
回答 1查看 9.8K关注 0票数 10

我正在尝试将QComboBox放入QStandardItem中,以便在QStandardItemModel中使用。我一直在四处寻找,但我没有找到答案,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-29 07:27:15

您不能在QStandardItemModel中存储QComboBox。假设您有以下选择:

a、b、c、d

QListView中有一个包含两个项目的列表,第一个值是A,第二个值是D:

代码语言:javascript
复制
 QListView* pView = new QListView();
 QStandardItemModel* pModel = new QStandardItemModel();
 pView->setModel(pModel);
 pModel->appendRow(new QStandardItem("A"));
 pModel->appendRow(new QStandardItem("D"));

我们在上面创建的是一个列表小部件,它将显示"A“和"D”的值。现在,让我们来看看QComboBox。我假设您想要编辑列表中"A“和"D”的值。为此,您需要创建一个QItemDelegate

请参阅http://doc.qt.io/qt-4.8/qitemdelegate.html

一次尝试:

代码语言:javascript
复制
 class ComboBoxDelegate : public QItemDelegate
 {
    Q_OBJECT

 public:
    ComboBoxDelegate(QObject *parent = 0);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                       const QModelIndex &index) const;

    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                   const QModelIndex &index) const;

    void updateEditorGeometry(QWidget *editor,
     const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

ComboBoxDelegate::ComboBoxDelegate(QObject *parent)
 : QItemDelegate(parent)
{
}

QWidget *ComboBoxDelegate::createEditor(QWidget *parent,
 const QStyleOptionViewItem &/* option */,
 const QModelIndex &/* index */) const
{
   QComboBox *editor = new QComboBox(parent);
   editor->addItem("A");
   editor->addItem("B");
   editor->addItem("C");
   editor->addItem("D");

   return editor;
}

void ComboBoxDelegate::setEditorData(QWidget *editor,
                                 const QModelIndex &index) const
{
   QString value = index.model()->data(index, Qt::EditRole).toString();

   QComboBox *cBox = static_cast<QComboBox*>(editor);
   cBox->setCurrentIndex(cBox->findText(value));
}

void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                const QModelIndex &index) const
{
   QComboBox *cBox = static_cast<QComboBox*>(editor);
   QString value = cBox->currentText();

   model->setData(index, value, Qt::EditRole);
}    

void ComboBoxDelegate::updateEditorGeometry(QWidget *editor,
 const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
   editor->setGeometry(option.rect);
}

然后需要在QListView上设置代理才能使其工作,请参见:

代码语言:javascript
复制
pView->setItemDelegate(new ComboBoxDelegate(pView));
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3135505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档