4

モデルデリゲートを介して(文字列の代わりに)QComboBox挿入して、をカスタマイズしたい:QWidgets

QComboBox *cb = new QComboBox(this);

FeatureModel *featureModel = new FeatureModel(cb);
cb->setModel(featureModel);

ComboBoxItemDelegate *comboBoxItemDelegate = new ComboBoxItemDelegate(cb);
cb->setItemDelegate(comboBoxItemDelegate);

FeatureModelはQAbstractListModelを継承し、ComboBoxItemDelegateはQStyledItemDelegateを継承します。

問題は、デリゲートメソッドが呼び出されないため、カスタムウィジェットが挿入されないことです(の文字列のみが表示されますFeatureModel)。ただし、のQTableView代わりにを使用すると、正常QComboBoxに機能します。

誰かがエラーがどこにあるか知っていますか?QTモデル/ビューの概念のいくつかの重要な側面が欠けていますか?

編集: これが私の代表です。(もちろん)コンストラクターを除いて、次のメソッドは呼び出されません(コンソールに出力されません)。

ComboBoxItemDelegate::ComboBoxItemDelegate(QObject *parent) :
QStyledItemDelegate(parent)
{
    qDebug() << "Constructor ComboBoxItemDelegate";
}

ComboBoxItemDelegate::~ComboBoxItemDelegate()
{
}

QWidget* ComboBoxItemDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
    qDebug() << "createEditor"; // never called
    QWidget *widget = new QWidget(parent);

    Ui::ComboBoxItem cbi;
    cbi.setupUi(widget);

    cbi.label->setText(index.data().toString());
    widget->show();

    return widget;
}


void ComboBoxItemDelegate::setEditorData ( QWidget *editor, const QModelIndex &index ) const
{
    qDebug() << "setEditorData"; // never called
}


void ComboBoxItemDelegate::setModelData ( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
{
    qDebug() << "setModelData"; // never called
}
4

1 に答える 1

3

私は問題を見つけたと思います。

まず、QComboBox編集が許可されているビューを確認します。

cb->view()->setEditTriggers(QAbstractItemView::AllEditTriggers);

それが良い習慣かどうかはわかりませんが、それが私がそれを機能させる唯一の方法でした。のデフォルト値editTriggersQAbstractItemView::NoEditTriggers

次に、モデルで編集が許可されていることを確認します。

Qt::ItemFlags MyModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::ItemIsEnabled;

    return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}

bool MyModel::setData(const QModelIndex &index,
                           const QVariant &value, int role)
{
    if (index.isValid() && role == Qt::EditRole) {
        // Modify data..

        emit dataChanged(index, index);
        return true;
    }
    return false;
}

ただし、問題があります。を初めて表示するときはComboBox、現在のアイテムテキストを変更でき、編集のためにデリゲートメソッドを呼び出すことはありません。1つのアイテムを選択する必要があります。そうすれば、それを編集できるようになります。

とにかく、QComboBox編集可能なアイテムにを使用するのは直感に反していることがわかりました。QComboBoxこのタスクにが必要ですか?

それが役に立てば幸い

于 2012-11-18T18:39:31.080 に答える