我对 qt 信号槽系统有问题。
首先,我创建了一个名为 System in Singleton 模式的类,因此我可以在需要的地方访问它的实例。系统有信号 SelectionChanged。
我有一个列表小部件,我正在将它的 itemSelectionChanged 信号连接到我的名为 onSelectionChanged 的自定义插槽。在 onSelectionChanged 插槽中,我发出系统的 SelectionChanged 信号。目前还没有问题。
在我的软件设计中,许多 GUI 小部件或自定义类可以使用对象的选择,并且系统的 SelectionChanged 信号可以由列表小部件以外的小部件发出。
所以我在列表小部件中创建了一个名为 OnSystemSelectionChanged 的插槽,然后将其连接到系统的 SelectionChanged 信号。 OnSystemSelectionChangedSlot 是这样的。
void MyListWidget::OnSystemSelectionChanged(QObject *sender)
{
if (sender == this) return;
// Then I want to get a list of selected objects and set them as selection of this widget like this:
this->SetSelection(System::Instance()->GetSelectedObjects());
}
但问题是当我开始设置列表小部件的选定项目时,它将发出 itemSelectionChanged 信号并且我的 onSelectionChanged 插槽将被调用。然后插槽将发出系统的 SelectionChanged 信号,然后 OnSystemSelectionChanged 也将被调用。它会通过 sender 参数停止,但没有立即设置列表小部件的选定项目的方法。
我怎样才能解决这个问题。
我希望我确实很好地解释了我的问题。提前致谢。
编辑:拼写和语法错误已更正。
最佳答案
在 Qt 中有几种方法可以处理这个问题。
将多个 View 与一个基础模型结合使用。这会自动处理对多个 View 控件的更改传播,您不需要做任何额外的事情。您可以使用 QDataWidgetMapper将“普通旧”小部件链接到模型中的数据元素。我想说这应该是首选的做事方式。无论如何,拥有所有 UI 的基础模型是朝着良好软件设计方向迈出的一步。
在数据模型之间传播更改时,同时实现 DisplayRole 和 EditRole。这些 View 名义上将使用其中一个角色(例如 EditRole)修改模型,而您可以通过编程方式使用另一个角色(例如 DisplayRole)修改模型>).您在自己的插槽中处理来自模型的 dataChanged 信号,正确处理角色,并在具有其他角色的其他模型上调用 setData 。这可以防止循环。
对于不是 QAbstractItemView 的控件,实现两个信号:一个在发生任何变化时发出,另一个仅在基于键盘/鼠标输入的变化时发出。这是QAbstractButton暴露的接口(interface),例如:toggled(bool)信号是前者,clicked()是后者。然后,您仅连接到基于输入的信号。
您自己的代码必须将编程更改传播到所有互连的控件,因为从您的代码更改一个控件不会修改其他控件。这应该不是问题,因为设计良好的代码应该从其余代码中封装 UI 控件的实现细节。因此,您的对话框/窗口类将以一种与显示特定属性的控件数量无关的方式公开其属性。
使用标志抑制信号发射 ( Bartosz's answer )。
在更改期间断开信号/槽连接 (Bartosz's answer)。
使用QObject::blockSignals()。
关于c++ - Qt Signal Slot Architecture 不需要的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20743380/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?
如何将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.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我