我已经将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;
}
在这种情况下如何获取发件人对象?感谢。
答案 0 :(得分:1)
不确定你的意图是什么。通常,在模型中已经更新数据时获取编辑器小部件是不必要的。
在我看来,需要对Model-View-Delegate
概念进行简要介绍才能解决您的问题。
简而言之,视图(在您的情况下是QTableView
)本身没有数据。 View通过调用data
方法从附加模型中获取数据。当用户尝试编辑某些数据时,会调用委托createEditor
和setEditorData
方法。后者将模型指针作为参数之一,因此它可以访问需要表示的实际数据。
当用户完成编辑时,调用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获取了所需的小部件。 谢谢你帮助我。