QtPropertyBrowser和值改变了信号

Edw*_*nge 6 c++ propertygrid qt4

我正在使用Qt Property Browser库作为记录编辑器.当用户完成对任何给定字段的编辑时,通过从编辑项目中删除焦点或按回车键,我希望被告知这一点,以便我可以进行更改,处理它并将其发送到REAL正在改变的项目.

不幸的是,我似乎只能找到propertyChanged和valueChanged信号,并且每次添加或删除任何数量的文本时都会触发它们,而不仅仅是在用户触发完成时.

如果无法获得此通知,我看不出它是如何成为可用组件的.当用户点击[ESC]时它甚至不会恢复,我当然需要能够实现!当然,我绝对没有做出我需要的信号,但我肯定找不到它.

谁知道?


在检查源代码时,制作行编辑器工厂的人做出了与textEdited连接而不是编辑完成的不幸决定.改变是一件相对简单的事情,除非有条理地使得扩展这个具有可扩展接口的编辑器工厂变得不可能!

所有我需要做的是覆盖createEditor函数,断开连接错误,连接更好的连接与之间的调用,以获得线编辑控件之外的字符串.但不是!!!我们不会让你那样做!我们将把所有的会计资料放在一个你无法访问或调用的私有类中,而那些我们打算让你调用的部分将与它们被调用它们的事实紧密联系在一起.编辑控件,而不是其他任何东西.ERGO,我们已经非常有效地让生活变得令人沮丧,我们无法想象.我们不是很棒吗?


我发现了更多.这些对象的标准Qt方法使用委托来控制我想要获得的行为.Qt属性库会覆盖此行为,并执行其他不是我正在尝试完成的操作.QAbstractItemDelegate接口内部是一个setModelData函数,当用户提交其编辑时,它被附加到的视图调用; 它们在没有提交的情况下销毁编辑器时不会被调用.

下一个技巧是学习Qt模型/视图架构并修补库以正确的方式完成.这甚至可能只是简单地删除了破坏我试图获得的行为的重写存根.也许放弃使用这个系统代替简单地使用QtTreeView可能是一个更好的选择,尽管能够保持在不同类型的浏览器之间切换的能力会很好.

Edw*_*nge 4

所以,这是我想出的半途而废的解决方案:

我向 TreePropertyBrowser 中的私有对象添加了一个“commitItem(QModelIndex)”函数。然后,当调用 setModelData() 函数时,我从委托中调用它。

然后找到属性,调用我添加到 AbstractBrowser 的新函数来获取属性的工厂,然后告诉工厂“commitProperty(QtProperty*)”。

该函数在底部是一个空的虚拟函数,在 LineEditFactory 中我重写它以应用属性更改,从而生成 valueChanged() 信号。

完成这些更改后,用户可以通过按 ESC 键退出编辑,并且如果他们通过按 RETURN、焦点更改等提交属性更改,我会收到通知...

目前仅适用于树版本。可能不会费心去尝试让其余的工作发挥作用。事实上,我可能会扔掉这个库,自己使用 QTreeView。它按照我想要的方式运行,必须对这个东西进行超级黑客攻击才能恢复其行为。

哦,是的,您还必须删除 LineEditFactory 的 createEditor() 中与 textChanged() 信号的连接。