gpt4 book ai didi

c++ - 刷新用作 QTableView 编辑器的 QComboBox 中的选项

转载 作者:太空宇宙 更新时间:2023-11-04 13:50:15 25 4
gpt4 key购买 nike

我在 Qt 的 QTableView 中使用 QComboxBox。当我添加一个新行时,我的委托(delegate)的 createEditor() 被调用,我可以用当时可用的正确选项集实例化组合框。问题是,用户可以在表外加载不同的文件,并且根据文件的内容,组合框需要更新它们的项目。有没有办法让我获得单元格的编辑器,以便我可以相应地更新选择?由于表格的其他单元格不应该被破坏,我不能简单地用新数据重新创建表格,我只需要更新某些单元格的组合框。

我一直在查看 QAbstractItemView 的源代码,并且有一个函数 editorForIndex() 正是我所需要的,但这在 View ,因此即使在派生类中也无法访问它。当然我可以保留我创建的盒子的记录,以便我以后可以相应地更新它们,但我想知道是否真的没有其他方法可以做到这一点。

最佳答案

您可以将组合框的内容作为 QStringList 中委托(delegate)的类成员。你的项目委托(delegate)可以是这样的:

#include <QItemDelegate>

#include <QComboBox>

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;

QStringList comboItems;

mutable QComboBox *combo;

private slots:

void setData(int val);

};

ComboBoxDelegate::ComboBoxDelegate(QObject *parent ):QItemDelegate(parent)
{
}

QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
combo = new QComboBox( parent );
QObject::connect(combo,SIGNAL(currentIndexChanged(int)),this,SLOT(setData(int)));
combo->addItems(comboItems);
combo->setMaxVisibleItems(comboItems.count());
return combo;
}

void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString text = index.model()->data( index, Qt::DisplayRole ).toString();

int comboIndex = comboItems.indexOf(QRegExp(text));

if(comboIndex>=0)
(static_cast<QComboBox*>( editor ))->setCurrentIndex(comboIndex);
}

void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
model->setData( index, static_cast<QComboBox*>( editor )->currentText() );
}


void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry( option.rect );
}

void ComboBoxDelegate::setData(int val)
{
emit commitData(combo);
//emit closeEditor(combo);
}

当您想在代码中某处更新组合框中的项目时,只需通过调用 itemDelegateForColumn 获取指向项目委托(delegate)的指针并访问 comboItems 成员:

ComboBoxDelegate * itemDelegate = (ComboBoxDelegate *)ui->tableView->itemDelegateForColumn(columnIndex);

//Updating combobox items
itemDelegate->comboItems.append("newItem");
...

关于c++ - 刷新用作 QTableView 编辑器的 QComboBox 中的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23722414/

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