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 将多列映射到单个自定义小部件的多个属性的主要内容,如果未能解决你的问题,请参考以下文章

将函数映射到 pyspark 数据框的多列

QDataWidgetMapper-在pyqt中查找sql​​ite数据库行的索引

将多列映射到 Spark 数据框中的单个键

如何将数据库中一张表的多列映射到类中的一个数组/列表?

基于两个数据帧中的多列将值从一个映射到另一个df

如何使用包含所有映射的查找表替换多列中的值?