Howto الجمع بين QabstractTableModel و QitemDelegate لمصدر عمل واحد؟
-
27-09-2019 - |
سؤال
انا املك QTableView
يحدد في ملف واجهة المستخدم. هذا هو الشكل:
أرغب في تغيير الشهر (حيث أحمر نقاط الصفيف) مع 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();
}
وبعد ذلك جعلت مندوبًا مثل هذا:
ComboBoxDelegate *delegate_ = new ComboBoxDelegate(this);
this->ui.tableView->setItemDelegate(delegate_);
ملاحظة: آسف للإخراج الطويل ، لكنني أعتقد أنه سيكون من الأفضل أن يتم تقديم جميع المصادر هنا.
شكرًا!
المحلول
من نظرة عامة على QabstractItemModel (انظر التصنيف الفرعي عنوان):
لتمكين التحرير في النموذج الخاص بك ، يجب عليك أيضًا تنفيذ SetData () ، وإعادة تنفيذ الأعلام () لضمان إرجاع القابلية للإعداد.
وترد نفس المعلومات في نظرة عامة على QabstractTableModel. لك PortfolioModel
الفئة لا يعيد تنفيذ أي من هذه الوظائف. من أجل استخدام محرر المندوب ، تحتاج إلى استخدام القيام بذلك.
بالتناوب ، قد ترغب فقط في الظهور كما لو كان combobox موجودًا (لا يسمح بالفعل بالتحرير). إذا كان هذا هو الحال ، فربما تحتاج إلى القيام ببعض الاختراقات في الرسم لجعله يظهر بهذه الطريقة ... أو وضع علامة عليه على أنه قابل للتحرير ولكنه يعطّل عنصر واجهة المستخدم ، أو شيء من هذا القبيل.
نصائح أخرى
في هذه المدونة http://qt-articles.blogspot.com/2010/07/how-to-customize-listview-in-qt-using.html يتم تقديم مثال على مندوب واحد .. يرجى التحقق من مندوبك مع نموذج نموذج المندوب الموجود في المدونة. آمل أن تحصل على بعض الدلائل.