【发布时间】:2016-11-22 16:34:34
【问题描述】:
我对 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;
}
在这种情况下如何获取 sender 对象?谢谢。
【问题讨论】:
-
dataChanged()从模型中发出(因为它是QAbstractItemModel的信号之一)。它不是发出了编辑器小部件。是什么让你认为它会从那里发出?您只能将sender()转换为QAbstractItemModel。 -
您还应该在
QObject上使用qobject_cast,而不是dynamic_cast:它会更快,并且在没有RTTI 的情况下也可以工作。 -
无论如何使用 qobject_cast 来解析 QObject 派生的指针。
-
你能更广泛地展示你想要实现的目标吗?为什么在模型中的数据已经更新后还需要访问编辑器小部件?
-
@Mike 是的,我知道 dataChanged() 信号是从模型中发出的。每当我的模型中的某些数据发生更改以通知视图时,我都会明确地发出它。我观察到,每当我在编辑器中双击任何单元格时,都会发出相同的信号,我试图通过获取用户双击的小部件来处理它的插槽中的一些事情。反正我已经实现了。谢谢。
标签: c++ qt qabstractitemmodel qstyleditemdelegate