0

我对 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 的结果相同。

我在我的表视图中设置组合框小部件派生 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;
 }

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

4

2 回答 2

1

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

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

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

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

您还可以查看 Qt 站点的Star Delegate Example以查看一些示例实现或模型视图教程以获取对模型视图主题的更广泛描述。

于 2016-11-22T22:11:43.767 回答
0

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

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

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

于 2016-11-23T06:03:22.370 回答