gpt4 book ai didi

qt - 如何将 QAbstractTableModel 和 QItemDelegate 结合到一个工作源?

转载 作者:行者123 更新时间:2023-12-04 06:48:35 26 4
gpt4 key购买 nike

我有一个 QTableView在 UI 文件中定义。下图:

alt text

我想用 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();
}

之后,我像这样制作了 init 委托(delegate):
ComboBoxDelegate *delegate_ = new ComboBoxDelegate(this);
this->ui.tableView->setItemDelegate(delegate_);

PS:很抱歉输出很长,但我认为如果所有来源都在这里显示会更好。

谢谢!

  • 添加:
  • 链接:
  • http://qtwiki.org/Category:QT_Widgets_components
  • http://www.sfr-fresh.com/unix/privat/gle-graphics-4.2.2f-src.tar.gz:a/gle-graphics-4.2.2/src/gui/variantdelegate.cpp
  • 最佳答案

    来自 QAbstractItemModel 的概述(见 子类 标题):

    To enable editing in your model, you must also implement setData(), and reimplement flags() to ensure that ItemIsEditable is returned.



    QAbstractTableModel 的概述中给出了相同的信息。 .您的 PortfolioModel类不会重新实现这些功能中的任何一个。为了使用委托(delegate)的编辑器,您需要这样做。

    或者,您可能只希望它看起来好像有一个组合框(实际上不允许编辑)。如果是这种情况,您可能需要自己做一些绘图技巧以使其以这种方式显示......或者将其标记为可编辑但禁用小部件,或类似的东西。

    关于qt - 如何将 QAbstractTableModel 和 QItemDelegate 结合到一个工作源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3438301/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com