无法在QAbstractItemModel的dataChanged信号的槽中获取发送方对象

时间:2016-11-22 16:34:35

标签: c++ qt qabstractitemmodel qstyleditemdelegate

我已经将QAbstractItemModel子类化,并尝试在dataChanged信号的插槽中检索一个小部件。

connect(model, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(slotDataChanged(const QModelIndex&, const QModelIndex&)));

void MyEditor::slotDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
    QComboBox* widget = dynamic_cast<QComboBox*>(sender());
    if (widget)
    {
         // do something
    }
}

这里我每次都得到一个空小部件,与qobject_cast相同。

我在tableview中设置了一个委托类小部件,它派生了QStyledItemDelegate。

MyDelegate* myDelegate;
myDelegate = new MyDelegate();
tableView->setItemDelegate(myDelegate);
tableView->setModel(model);


 QWidget* MyDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
 {
      QComboBox* cb = new QComboBox(parent);
      cb->addItem(QString("All"));
      cb->setCurrentIndex(0);
      return cb;
 }

在这种情况下如何获取发件人对象?感谢。

2 个答案:

答案 0 :(得分:1)

不确定你的意图是什么。通常,在模型中已经更新数据时获取编辑器小部件是不必要的。 在我看来,需要对Model-View-Delegate概念进行简要介绍才能解决您的问题。

简而言之,视图(在您的情况下是QTableView)本身没有数据。 View通过调用data方法从附加模型中获取数据。当用户尝试编辑某些数据时,会调用委托createEditorsetEditorData方法。后者将模型指针作为参数之一,因此它可以访问需要表示的实际数据。

当用户完成编辑时,调用setModelData,其中编辑器小部件可用于获取更新的值。它还具有可用于更改通常通过setData方法完成的正确数据输入的模型。此时会发出dataChanged信号,通知视图相应的数据已更新,因此可以刷新显示的值。

因此,请尝试重新思考您的设计。也许您想要实现的目标可以以不同方式实现,或者您的实现可以稍微修改以符合所描述的流程。

您还可以查看Qt网站Star Delegate Example以查看一些示例实现,或Model View Tutorial查看更多关于模型 - 视图主题的说明。

答案 1 :(得分:0)

我的模型/视图设计很好。当用户双击我的编辑器中的单元格时,我只需要获取一个小部件。

QComboBox* widget = dynamic_cast<QComboBox*>(tableView->indexWidget(topLeft));
if (widget)
{
    // Do something
}

在slotDataChanged中,我使用QModelIndex获取了所需的小部件。 谢谢你帮助我。