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

Unable to obtain sender object in slot of dataChanged signal of QAbstractItemModel

我已经子classed 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 的委托 class。

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;
 }

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

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

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

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

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

您还可以查看 Qt 站点以获取 Star Delegate Example to see some sample implementations or Model View Tutorial 模型视图主题的更广泛描述。

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

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

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