gpt4 book ai didi

c++ - QtPropertyBrowser 和值更改信号

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:48 35 4
gpt4 key购买 nike

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

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

如果无法获得此通知,我看不出这是一个可用的组件。当用户点击 [ESC] 时,它甚至不会恢复,我当然需要能够实现!肯定是我错了,绝对没有信号满足我的需要,但我确实找不到它。

有人知道吗?


检查源代码后,制作行编辑器工厂的人做出了一个不幸的决定,即连接 textEdited 而不是 editingFinished。改变将是一件相对简单的事情,只是非常有条理地使得无法扩展这个具有可扩展接口(interface)的编辑器工厂!

我需要做的就是覆盖 createEditor 函数,断开不良连接,连接一个更好的连接,并在两者之间进行调用以从行编辑控件中获取字符串。但不是!!!我们不会让你那样做的!我们将把所有的会计内容放在一个你无法访问或调用的私有(private)类中,我们将让你调用的那些部分将与它们被调用的事实紧密耦合编辑控件,而不是其他任何东西。因此,我们已经非常有效地使生活变得像我们想象的那样令人沮丧地不可能。我们不是很棒吗?


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

下一个技巧是学习 Qt 模型/ View 架构并修补库以正确的方式完成它。这甚至可能只是简单地删除破坏我试图获得的行为的压倒一切的 stub 。也可能放弃使用该系统而不是简单地使用 QtTreeView 可能是更好的选择,尽管能够保留在不同类型的浏览器之间切换的能力会很好。

最佳答案

所以,这是我想出的半屁股修复:

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

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

此函数在基础上是一个空的虚拟函数,在 LineEditFactory 中我重写它以应用属性更改,这会生成 valueChanged() 信号。

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

目前仅适用于树版本。可能不会费心尝试让其余的工作。事实上,我可能会放弃这个库,自己使用 QTreeView。 IT 以我想要的方式运行,必须对这件事进行 uber-hack 才能恢复该行为。

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

关于c++ - QtPropertyBrowser 和值更改信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4466733/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com