QAbstractTableModel と QItemDelegate を 1 つの作業ソースに結合するにはどうすればよいですか?
-
27-09-2019 - |
質問
私は持っています QTableView
UIファイルで定義します。図は次のとおりです。
月を変更したいのですが( 赤 配列点) QComboBox
ウィジェット、デリゲートを処理していますが、私にとって、カスタム デリゲートとモデルにとっては複雑すぎる問題で、何が問題なのかわかりません。
問題:私の意見では、 QAbstractTableModel
一緒に作業することはできません QItemDelegate
, 、カスタムシンプルを組み合わせることができないため、 ComboBoxDelegate
QTableView を使用したウィジェット。なんと?
私が持っているものは次のとおりです。
私のカスタムデリゲートヘッダー/ソースデータ:
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(index.data(Qt::DisplayRole).toString());
return editor;
}
void ComboBoxDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
QString value = index.model()->data(index, Qt::EditRole).toString();
QComboBox *comboBox = static_cast<QComboBox*>(editor);
comboBox->setCurrentIndex(comboBox->findText(value));
}
void ComboBoxDelegate::setModelData(QWidget *editor,
QAbstractItemModel *model,
const QModelIndex &index) const
{
QComboBox *comboBox = static_cast<QComboBox*>(editor);
QString value = comboBox->currentText();
model->setData(index, value, Qt::EditRole);
}
モデルデータ:
class PortfolioModel : public QAbstractTableModel
{
Q_OBJECT;
// types
enum Position
{
ePosValue = 0
, eColumnCount
};
enum Constants
{
eLocalCcy = 0
, eCurrentTime
, eCurrentMonthName
, eRowCount
};
// data
static QFont font_;
static QBrush foreground_;
static QBrush background_;
// methods
QVariant _valueName(int index) const;
QVariant _valueNameTooltip(int index) const;
QVariant _data(int index, int col, bool tooltip) const;
public:
PortfolioModel(QObject* parent = 0);
~PortfolioModel();
int rowCount(const QModelIndex& parent = QModelIndex()) const;
int columnCount(const QModelIndex& parent = QModelIndex()) const;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
signals:
void resizeToContents(void);
public slots:
void refreshData(void);
};
QFont PortfolioModel::font_ = QFont("Tahoma", 8, QFont::Normal);
QBrush PortfolioModel::foreground_ = QBrush(QColor("#000000")); // Black
QBrush PortfolioModel::background_ = QBrush(QColor("#C3FDB8")); // Dark Sea Green1
PortfolioModel::PortfolioModel(QObject* parent)
: QAbstractTableModel(parent)
{}
PortfolioModel::~PortfolioModel()
{}
void PortfolioModel::refreshData(void)
{
emit dataChanged(QModelIndex(), QModelIndex());
emit resizeToContents();
}
int PortfolioModel::rowCount(const QModelIndex& parent/* = QModelIndex()*/) const
{
return eRowCount;
}
int PortfolioModel::columnCount(const QModelIndex& parent/* = QModelIndex()*/) const
{
return eColumnCount;
}
QVariant PortfolioModel::data(const QModelIndex& index, int role/* = Qt::DisplayRole*/) const
{
if (!index.isValid())
return QVariant();
switch (role)
{
case Qt::DisplayRole:
return _data(index.row(), index.column(), false);
case Qt::FontRole:
break;
case Qt::BackgroundRole:
return background_;
case Qt::ForegroundRole:
return foreground_;
case Qt::TextAlignmentRole:
case Qt::DecorationRole:
case Qt::EditRole:
break;
case Qt::ToolTipRole:
return _data(index.row(), index.column(), true);
case Qt::StatusTipRole:
case Qt::WhatsThisRole:
case Qt::SizeHintRole:
break;
}
return QVariant();
}
QVariant PortfolioModel::headerData(int section, Qt::Orientation orientation, int role) const
{
switch (orientation)
{
case Qt::Horizontal:
switch (role)
{
case Qt::DisplayRole:
if (section == ePosValue)
{
return QVariant("Value");
}
case Qt::ToolTipRole:
if (section == ePosValue)
{
return QVariant("Fund values");
}
break;
}
case Qt::Vertical:
switch (role)
{
case Qt::DisplayRole:
return _valueName(section);
case Qt::ToolTipRole:
return _valueNameTooltip(section);
}
break;
}
return QVariant();
}
QVariant PortfolioModel::_valueNameTooltip(int index) const
{
switch (index)
{
case eLocalCcy:
return QObject::tr("Local currency");
case eCurrentTime:
return QObject::tr("Current time");
case eCurrentMonthName:
return QObject::tr("Current Month");
}
return QVariant();
}
QVariant PortfolioModel::_valueName(int index) const
{
switch (index)
{
case eLocalCcy:
return QObject::tr("Local Currency");
case eCurrentTime:
return QObject::tr("Current Time");
case eCurrentMonthName:
return QObject::tr("Month");
}
return QVariant();
}
QVariant PortfolioModel::_data(int index, int col, bool tooltip) const
{
switch (index)
{
case eLocalCcy:
if (col == ePosValue)
{
return QString(Nav::bk()->currentFund().currency(Nav::bk()->currentFund().localCcy()).code());
}
break;
case eCurrentTime:
if (col == ePosValue)
{
return Nav::bk()->currentFund().currentTime();
}
break;
case eCurrentMonthName:
if (col == ePosValue)
{
return QDate::longMonthName(Nav::bk()->currentFund().currentTime().date().month());
}
break;
}
return QVariant();
}
その後、次のように init デリゲートを作成しました。
ComboBoxDelegate *delegate_ = new ComboBoxDelegate(this);
this->ui.tableView->setItemDelegate(delegate_);
追伸:長い出力で申し訳ありませんが、すべてのソースがここに表示されるとより良くなると思います。
ありがとう!
解決
の概要から QAbstractItemModel (を参照してください。 サブクラス化 見出し):
モデルで編集を有効にするには、setData()とreimplement flags()を実装して、Itemisedaitが返されるようにする必要があります。
同じ情報が概要にも記載されています。 QAbstractTableModel. 。あなたの PortfolioModel
class はこれらの関数を再実装しません。デリゲートのエディタを使用するには、 do so を使用する必要があります。
あるいは、コンボボックスがあるかのように表示するだけ (実際には編集を許可しない) こともできます。その場合は、そのように見えるように自分で描画ハックを行う必要があるでしょう...または、編集可能としてマークしてウィジェットを無効にする、またはそのようなものです。
他のヒント
このブログで http://qt-articles.blogspot.com/2010/07/how-to-customize-listview-in-qt-using.html デリゲートの例を 1 つ示します。ブログにあるデリゲートのサンプル例でデリゲートを確認してください。何か手がかりが得られるかもしれないと願っています。