【问题标题】:QComboBox not calling Delegate methodsQComboBox 不调用委托方法
【发布时间】:2012-11-17 12:41:59
【问题描述】:

我想通过 modeldelegate 插入 QWidgets(而不是字符串)来自定义 QComboBox

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 Model/View 概念的一些重要方面?

编辑: 这是我的代表。 除了构造函数(当然),没有调用以下方法(控制台上没有输出)。

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
}

【问题讨论】:

  • 它应该可以正常工作,你能粘贴你的委托代码吗?

标签: c++ qt delegates qcombobox model-view


【解决方案1】:

我想我找到了问题。

首先,确保QComboBox 中的视图允许编辑:

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

我不确定这是否是一个好的做法,但这是我让它发挥作用的唯一方法。 editTriggers 的默认值为QAbstractItemView::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,可以更改当前项的文本,不会调用委托方法进行编辑。您必须选择一项,然后才能对其进行编辑。

无论如何,我发现将QComboBox 用于可编辑项目是违反直觉的。您确定需要QComboBox 来完成此任务吗?

希望对你有帮助

【讨论】:

  • 非常感谢!它现在可以工作了,正在调用方法,正在创建小部件,并且它们也显示在组合框中。关于您的问题:组合框应该包含用户可以通过单击属于特定项目的按钮来删除的项目。此外,我正在考虑添加另一个按钮以获取有关该项目的一些信息和一个指示其类型的小图像。这就是为什么我想要一个额外的小部件。
  • 这听起来很奇怪,但是是的,也许组合框是要走的路。很高兴它成功了
猜你喜欢
  • 1970-01-01
  • 2012-09-22
  • 2014-11-21
  • 2017-02-14
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多