似ていると思われる多くのトピックを既に確認しましたが、役に立たなかったので、この質問をしています。すでに存在する重複した質問を知っている場合は、私にその質問を教えてください。
私の状況:
QStandardModel を持つ QTableView の 1 列に (QCombobox) QItemDelegate があります。値を直接編集するか、コンボボックスを使用して選択すると、正常に機能するようになりました。しかし、必要に応じてテーブルをリロードできるように、テーブルの状態を保存するオプションも提供しようとしています。
問題:
プログラムで項目を設定してリロードするとテーブルに反映されません。
両方試してみました
1) インデックスを取得し、setData を使用して、
2) QStandardItem の取得とテキストの設定。
setEditorData が呼び出されていないこともわかりました。私は何を間違っていますか?このようなセルの値をコードで設定するにはどうすればよいですか?
編集:いくつかの詳細
QItemDelegate を DropDown としてサブクラス化しました。
ドロップダウン.h
#ifndef DROPDOWN_H
#define DROPDOWN_H
#include <QItemDelegate>
#include <QWidget>
#include <QStringListModel>
#include <QStringList>
class DropDown : public QItemDelegate
{
Q_OBJECT
public:
explicit DropDown(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;
void setComboData(QStringList list);
QStringList getComboData();
private:
QStringListModel *listmodel;
signals:
public slots:
};
#endif // DROPDOWN_H
ドロップダウン.cpp
#include "dropdown.h"
#include <QComboBox>
DropDown::DropDown(QObject *parent) :
QItemDelegate(parent)
{
listmodel = new QStringListModel(parent);
}
QWidget *DropDown::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QComboBox *editor = new QComboBox(parent);
editor->setEditable(true);
editor->setInsertPolicy(QComboBox::NoInsert);
editor->setModel(listmodel);
return editor;
}
void DropDown::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString value = index.model()->data(index,Qt::EditRole).toString();
QComboBox *original = static_cast<QComboBox *>(editor);
original->setCurrentIndex(original->findText(value));
}
void DropDown::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QComboBox *original = static_cast<QComboBox *>(editor);
QString value = original->currentText();
model->setData(index, value, Qt::EditRole);
}
void DropDown::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}
void DropDown::setComboData(QStringList list)
{
listmodel->setStringList(list);
}
QStringList DropDown::getComboData()
{
return listmodel->stringList();
}
これが表での使用方法です。
model = new QStandardItemModel(0,11, this);//i update row count later while adding items.
ui->itemTable->setModel(model);
sourceSet = new DropDown(this);
ui->itemTable->setItemDelegateForColumn(3, sourceSet);