访问指向customdelegate的QWidget(Combobox)的指针

时间:2015-03-20 09:32:19

标签: qt qwidget qtableview qcombobox qstyleditemdelegate

我从QStyledItemDelegate派生了一个班级。我在这个代表中使用QComboBox。此委托用于QTableView

我的问题是,如何以编程方式更改委托中的Combobox索引,即如何在委托类之外访问指向该窗口小部件的指针?  我已经检查过,当我们点击组合框时会自动调用CreateEditorSetEditorDataSetModelData个函数(QStyledItemDelegate),我们无法手动调用它们来操纵数据模特。

2 个答案:

答案 0 :(得分:1)

afaik任何时候你开始编辑并显示组合框,它将分配一个新组合。如果你想拥有一个永久的组合框,你应该看看

QTableView::setIndexWidget(const QModelIndex&, QWidget*)

因此您可以使用以下代码访问组合框:

const QMoodelIndex idx = model->index(row, column);
QWidget* wid = view->indexWidget(idx);
QComboBox* box = qobject_cast<QComboBox*>(wid);
if (box)
    // do your thing

答案 1 :(得分:0)

您可以在QStringList中将组合框的内容作为代理人的班级成员。您的项目委托可以是:

#include <QStyledItemDelegate>

#include <QComboBox>

class ComboBoxDelegate: public QStyledItemDelegate
{
 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 ):QStyledItemDelegate(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并访问comboItems成员即可获得指向项目委托的指针:

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

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