QStandardItem + QComboBox

Я пытаюсь поместить a QComboBox в a QStandardItem использоваться в a QStandardItemModel. Я озирался, и я не могу найти ответ, какие-либо идеи?

10
задан AAEM 22 August 2018 в 18:02
поделиться

1 ответ

Вы не храните QComboBox в QStandardItemModel . Допустим, у вас есть следующие варианты выбора:

A B C D

, и у вас есть список с двумя элементами в QListView , первое значение - A, второе - D:

 QListView* pView = new QListView();
 QStandardItemModel* pModel = new QStandardItemModel();
 pView->setModel(pModel);
 pModel->appendRow(new QStandardItem("A"));
 pModel->appendRow(new QStandardItem("D"));

То, что мы создали выше, представляет собой виджет списка, который будет отображать значения " А »и« Г ». Теперь к QComboBox . Я предполагаю, что вы хотите отредактировать значения «A» и «D» в списке. Для этого вам необходимо создать QItemDelegate .

См. http://doc.qt.io/qt-4.8/qitemdelegate.html

Попытка:

 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 чтобы заставить его работать, см .:

pView->setItemDelegate(new ComboBoxDelegate(pView));
14
ответ дан 3 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: