gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:24:56 27 4
gpt4 key购买 nike

我已经对 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 的委托(delegate)类。

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 本身没有数据。 View 通过调用 data 方法从附加模型中获取数据。当用户试图编辑一些数据时,调用委托(delegate) createEditorsetEditorData 方法。后者将模型指针作为参数之一,因此它可以访问需要表示的实际数据。

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

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

您还可以在 Qt 站点上查看 Star Delegate Example查看一些示例实现或 Model View Tutorial有关模型- View 主题的更广泛描述。

关于c++ - 无法在 QAbstractItemModel 的 dataChanged 信号槽中获取发送者对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747074/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com