我使用 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/
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe
假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO