- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 QTableView
在 UI 文件中定义。下图:
我想用 QComboBox
更改月份( 红色 数组点)小部件,处理委托(delegate),但对我来说,对于我的自定义委托(delegate)和模型来说,这是一个太复杂的问题,我不知道出了什么问题?!
问题 : 在我看来,QAbstractTableModel
无法使用 QItemDelegate
,因为我无法组合我的自定义简单 ComboBoxDelegate
带有 QTableView 的小部件。什么?
这是我所拥有的:
我的自定义委托(delegate) header /源数据:
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 的概述(见 子类 标题):
To enable editing in your model, you must also implement setData(), and reimplement flags() to ensure that ItemIsEditable is returned.
PortfolioModel
类不会重新实现这些功能中的任何一个。为了使用委托(delegate)的编辑器,您需要这样做。
关于qt - 如何将 QAbstractTableModel 和 QItemDelegate 结合到一个工作源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3438301/
我有 QListView 与 QItemDelegate 的自定义实现。 MyItemDelegate 重新实现 createEditor() 以显示自定义小部件。小部件的大小取决于内容。 默认情况下
我正在尝试使用我在 Google 中找到的简单示例代码。 一切正常,但一旦我为列设置了委托(delegate),它就会显示错误。 这是 line我将“Bank”字符串设置为两行和 comboboxde
我有一个 QTreeview 并且我使用了这个样式表 QTreeView#treeView::item:selected:active { background: qlineargradien
我的 QTableView 和 QItemDelegate 类有问题。对于一列,我的代表创建了一个简单的组合框,一切正常。对于我的第二列,我需要一个在单个小部件中具有两个组合框的小部件。 我在我的 Q
我实现了以下委托(delegate),以在 QTableView 中提供组合框。用例是用等效的文本替换通常对用户无意义的列(键)(例如数字 ID)。 下面的代码片段有效(也用于保存正确的值),但它存在
我在项目上工作它就像 Qt 示例项目中的 SpinBoxDelegate 但我必须自定义它,我的意思是在 TableView 的第二列和第三列中有不同的小部件(文本框)而不是 spainBox。你有什
我有一个 QTreeView 和它的 QItemDelegate。QTreeView 有很多项。 目标: 如果我选择这些项目中的一个,那么不仅选择的项目而且其他一些(在我的其他条件之后)项目也必须重新
使用 QT4 的最佳方式是什么 QItemDelegate在 View 中显示图像的缩略图? 具体来说,当从非常大的图像文件 (> 500MB) 生成 pixmaps 时,如何阻止项目委托(deleg
Qt 5.5 有一个虚拟方法来为编辑模式定义一个自定义小部件: QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem & o
我正在使用 QItemDelegate 制作表格。我使用 paint(..) 方法绘制委托(delegate)项目,使其在退出编辑模式时看起来相同,但我还需要在项目被选中与否时以不同方式绘制项目,并且
如何制作一个自定义的 QItemDelegate 就像所附的图片一样。这是一个 QTreeView。我要自定义的最后一个元素并添加一个 QItemDelegate 现在我只有绿色的 separator
我有一个 QTableView 显示来自自定义模型的数据。我有一个 QItemDelegate 用于每个单元格的版本。 View 的一列有一个由 QLineEdit 和 QCheckBox 组成的自定
我创建了一个自定义项目委托(delegate),它允许用户编辑文件路径列表: 我通过自定义类 DirEdit 实现了这一点。现在选定的路径已提交,当用户按下 enter 时编辑器关闭,但我想添加两种情
我为 QTableView 的一列设置了自定义项委托(delegate)。在某些情况下,我需要将其删除(即设置默认项目委托(delegate))。但是QT好像不允许这样。即使在设置新委托(delega
这两个类都为模型中的数据项提供显示和编辑功能。 QStyledItemDelegate 较新,关于 QItemDelegate 的 Qt 文档指出: Note that QStyledItemDele
我有一个 QTableView在 UI 文件中定义。下图: 我想用 QComboBox 更改月份( 红色 数组点)小部件,处理委托(delegate),但对我来说,对于我的自定义委托(delegate
使用 Qt ItemViews,可以通过 QItemDelegate 修改项目的编辑小部件,该 QItemDelegate 可以通过 createEditor 创建自定义编辑器。谁负责删除委托(del
使用 Qt ItemViews,可以通过 QItemDelegate 修改项目的编辑小部件,该 QItemDelegate 可以通过 createEditor 创建自定义编辑器。谁负责删除委托(del
我有一个自定义 QSortFilterProxyModel,它只显示表格中的某些行和列。我还有一个自定义 QItemDelegate 来控制表中某些值的绘制方式。我只将委托(delegate)应用于需
我正在尝试将委托(delegate)设置为我的 QTreeWidget。问题是永远不会调用委托(delegate) setModelData。调用 createEditor 和 setEditorDa
我是一名优秀的程序员,十分优秀!