c++ QDataWidgetMapper中的任何值如何在QtComboBox上进行委托(例如)?

v7pvogib  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(134)

我试图理解一个非常具体的概念,其中模型中的值可以用于小部件。QComboBox是一个需要一些内部查找的特定小部件。
QDataWidgetMapper通过“addMapping”向模型中的索引添加QComboBox,也可以设置特定属性。如果文本出现在QComboBox中的值中,那么最简单的方法“就可以工作”。在引擎盖下可能有一些QItemDelegate,它可以使模型具有普通字符串,并且QComboBox将正确选择正确的项。
我试图在C++中找到实际的实现。我希望它会发生在QComboBoxDelegate中,但没有任何迹象表明已经完成了任何索引查找。在超类QStyledItemDelegate中,使用了setEditorData和editor->setProperty(n,v)。是从setCurrentText调用的那一点开始的吗?Is editor->metaObject()->userProperty().name();由于Q_PROPERTY(QString currentText READ currentText WRITE setCurrentText NOTIFY currentTextChanged USER true)而工作?
QStyledItemDelegate: commit QComboBox value to model on clickQDataWidgetMapper ignoring inheritance

qoefvg9y

qoefvg9y1#

当创建一个新的QDataWidgetMapper示例时,它会在内部创建并设置一个基本的QItemDelegate作为其初始委托[1]。
addMapping()有两种使用方法:通过使用小部件和部分,或者还通过提供特定于该小部件的属性名称。
当widget被更新[2]时,只有widget和section用于addMapping(),QDataWidgetMapper在delegate上调用setEditorData()
默认实现将数据存储在 editor 小部件的user property中。
QComboBox的USER属性实际上是currentText [3]:
如果组合框是可编辑的,则setter setCurrentText()只需调用setEditText()。否则,如果列表中有匹配的文本,currentIndex将被设置为相应的索引。
如果需要使用组合框更好地控制Map器的行为,您有不同的可能性:

  • 创建一个自定义的USER属性(最后声明的用户属性总是被认为是实际的属性);
  • 设置另一个属性(即使是自定义属性),并在另一个addMapping()重载中提供其名称;在这种情况下,Qt将简单地调用具有给定属性名的小部件上的setProperty();
  • 使用自定义QItemDelegate,然后覆盖setEditorData(),可能的话,覆盖setModelData();

注意,对于第三个选择,基本QItemDelegate(甚至QAbstractItemDelegate)应该足够了。由于某些原因,Qt 6使用QStyledItemDelegate代替。
[1]请参阅qdatawidgetmapper.cpp中的构造函数(Qt 5源代码,codebrowser.dev)。
[2]在同一代码中查看populate()函数(Qt,codebrowser)。
[3]如果组合是可编辑的,则设置行编辑上的文本,否则使用findText(),如果索引>= 0,则最终使用setCurrentIndex()

相关问题