QDataWidgetMapper 将多列映射到单个自定义小部件的多个属性
Posted
技术标签:
【中文标题】QDataWidgetMapper 将多列映射到单个自定义小部件的多个属性【英文标题】:QDataWidgetMapper to map multiple columns to multiple properties of single custom widget 【发布时间】:2018-11-08 16:41:21 【问题描述】:这几天我一直在寻找解决方案。情况如下:
我有一个自定义滑块类,它有两个句柄来控制一系列双打,我为此创建了四个属性:
Q_PROPERTY(double minimum MEMBER mMinimum NOTIFY minimumChanged USER true)
Q_PROPERTY(double maximum MEMBER mMaximum NOTIFY maximumChanged USER true)
Q_PROPERTY(double lowerValue MEMBER mLowerValue NOTIFY lowerValueChanged USER true)
Q_PROPERTY(double upperValue MEMBER mUpperValue NOTIFY upperValueChanged USER true)
我将这些属性绑定到 QDataWidgetMapper:
settingsMapper->addMapping(ui->cutLevelSlider, settings.indexOf("lowerCutLevel"), "lowerValue");
settingsMapper->addMapping(ui->cutLevelSlider, settings.indexOf("upperCutLevel"), "upperValue");
settingsMapper->addMapping(ui->cutLevelSlider, settings.indexOf("minValue"), "minimumValue");
settingsMapper->addMapping(ui->cutLevelSlider, settings.indexOf("maxValue"), "maximumValue")
settingsMapper->toFirst();
,希望我可以在滑块和settings
项目模型之间进行两种更新,该模型管理设置值的单一真实性。换句话说,我正在尝试使用滑块cutLevelSlider
作为模型settings
中存储的最小、最大、下限、上限4 个值的视图。
但它不起作用。当我滑动滑块时,只有滑块的最后一个属性(upperValue)会更新到模型中,其他所有属性都不会改变。当我通过另一个小部件更改模型时(例如,从 tableview 编辑),滑块状态不会相应更改。
有人可以帮我解决这个问题吗?
【问题讨论】:
(假设ui->cutLevelSlider
是一个QSlider)是否有理由不将滑块的valueChanged
信号连接到任意槽,然后通过这些槽修改你的四个变量的值?
这个想法是,这些值不仅可以由这个滑块查看/控制,还可以由其他小部件查看/控制。我希望有 2 路绑定,即当值被编辑框更改时,我希望看到滑块也相应地更改。据我所知,这正是 QDataWidgetMapper 的目的,但不幸的是,它甚至不适用于自定义小部件或非编辑小部件。
这个有什么更新吗?还在寻找将多个字段映射到同一个小部件的多个 Qt 属性的解决方案。任何解决方法也将不胜感激。
我来到了同样的话题 :) 但是如果你正在做自定义小部件,为什么不包括 QDataWidgetMappers 作为它的私有成员?即使您想控制模型中的字段名称,您也可以创建一些 Bind(fieldname1, fieldname2, ...) 方法,该方法将采用字段名称并在自定义 widger 中处理正确的绑定。不确定这个想法有多好,但我没有其他想法,我会尝试一下。
【参考方案1】:
查看https://forum.qt.io/topic/112644/qdatawidgetmapper-to-map-multiple-columns-to-multiple-properties-of-single-custom-widget/3
self.mapper = QDataWidgetMapper(self)
self.mapper.setModel(model)
self.mapper.addMapping(self.btnLoad, 7, b'enabled')
self.mapper2 = QDataWidgetMapper(self)
self.mapper2.setModel(model)
self.mapper2.addMapping(self.btnLoad, 8, b'text')
self.mapper.toFirst()
self.mapper2.toFirst()
【讨论】:
以上是关于QDataWidgetMapper 将多列映射到单个自定义小部件的多个属性的主要内容,如果未能解决你的问题,请参考以下文章