• 11697阅读
  • 52回复

[提问]如何让两个button的槽函数一个先执行,一个后执行呢? [复制链接]

上一主题 下一主题
离线dbzhang800

只看该作者 40楼 发表于: 2013-11-01
Re:回 37楼(dbzhang800) 的帖子
引用第39楼foxgod于2013-11-01 17:15发表的 回 37楼(dbzhang800) 的帖子 :
我现在的情况是什么呢,就是连续点击button,消息堆积在队列里面,不知道什么原因造成了崩溃,当然可能不是信号和槽的问题,但是我就是不想消息推挤,就是想在队列里面有5个消息,我就执行一个消息。后面其他的都不执行,也就是我button1点击后,后面所有的都不执行,比如鼠标事件,移动事件,button2 ,button3触发事件,我都要屏蔽,不执行了。我想我这次说明白了吧,我的代码就是看看怎么样可以屏蔽。


问题在于:Qt默认的就是你所期待的效果。而且你也没有给出一个能重现你所提到的问题的简单例子。

所以最可能的就是:你解决问题的方向错了。


离线alexltr

只看该作者 41楼 发表于: 2013-11-02
你的button是不是设置了autorepeat属性? 要不然槽函数在执行过程中是不可能响应其它事件的。如果autorepeat为true,槽函数又没有完成,这时连续点击就会崩溃
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
离线foxgod

只看该作者 42楼 发表于: 2013-11-04

哥们,我没有说在槽函数执行过程中执行了别的操作,是说我在点击5次button的时候,这五次信号被保存在队列里面,第一次button的槽函数执行完,又执行第二次button的槽函数执行,接着是第三次,四次,五次,可是我只想第一次槽函数执行完,就不执行第二次,第三次,第四次槽函数的执行,当然你们可以说设置一个bool变量去判断,可是第一次槽函数执行完,去设置bool为true,这样可以阻止其他操再次执行,可是这样一来,你只是阻止了第一次连续点击五次button的,其他四次button的执行,加入我在次连续点击五次button,就不不起作用了。
比如下面。


  1. void Widget::setBackground(QObject *obj)
  2. {
  3.      switch(obj->objectName().toInt())
  4.     {  
  5.     case 0:
  6. m_judge = true;
  7.         if(m_judge = true)
  8.         {
  9.             qDebug()<<"enter button0";
  10.             m_judge = false ;
  11.         }
  12.         else
  13.         {
  14.             qDebug()<<"don't enter button0";            
  15.         }
  16.         
  17.         break;
  18.     case 1:
  19.         qDebug()<<"enter button1";
  20.        break;
  21.     case 2:
  22.        qDebug()<<"enter button2";
  23.        break;
  24.     }
  25. }
               这样第一次可以阻止其他四次button的点击,但是你再次;连续点击5此button就不可以执行了,对不


离线foxgod

只看该作者 43楼 发表于: 2013-11-04
回 40楼(dbzhang800) 的帖子
我一直没有说,在button的槽执行中再次执行了别的槽函数,我一直说的是在button执行完又再次执行了别的槽函数,但是我想拦截别的槽函数,估计你一直没理解我。
离线dbzhang800

只看该作者 44楼 发表于: 2013-11-04
;-) 你这个帖子在qtcn和qt-project.org中都有些日子了。


所以才要你给出例子嘛,因为不止我不理解,论坛中其他同胞也都没有理解。不止国内同胞没理解,qt-project.org/forums 中的国外开发者也没有理解。

---
很可能你遇到问题的程序,代码量比较大。但是你想确定问题是不是和你认为的一样,你需要一个小程序来重新问题才行。而一旦你可以重现问题。无论是在论坛提问,还是去提交bug,应该都很容易解决问题。

如果不能重现问题,通常是你先入为主,找错方向了。
离线dbzhang800

只看该作者 45楼 发表于: 2013-11-04
重现问题并不需要太多代码,一个完整的程序可能只有几行代码

比如,bug25985

https://bugreports.qt-project.org/browse/QTBUG-25985

在比如,qmake遇到一个pro文件会失败
https://bugreports.qt-project.org/browse/QTBUG-27629

在能重现问题的情况下,代码越少对定位问题越有效。

通常找到问题是最困难的,一旦找到问题,解决问题往往很简单。
离线foxgod

只看该作者 46楼 发表于: 2013-11-04
回 45楼(dbzhang800) 的帖子
哥们,我想哭,我的demo就是我的小例子,只要你能把我的demo做成我要的效果,就OK了,我没有别的demo,只是想这样做。不存在我方向错误。我只是想在我的demo里面做成这样。
离线dbzhang800

只看该作者 47楼 发表于: 2013-11-04
Re:回 45楼(dbzhang800) 的帖子
引用第46楼foxgod于2013-11-04 11:14发表的 回 45楼(dbzhang800) 的帖子 :
哥们,我想哭,我的demo就是我的小例子,只要你能把我的demo做成我要的效果,就OK了,我没有别的demo,只是想这样做。不存在我方向错误。我只是想在我的demo里面做成这样。


好吧,咱们回头看看你的问题?

在顶楼中,你如是说:

我现在有两个button,每个button都有一个槽函数,第一个button的槽函数的执行需要一些时间,我想做的是,第一个button还没有执行完的时候,我点击第二个button,就不执行第二个button里面的槽函数


在43楼中,你如是说:

我一直没有说,在button的槽执行中再次执行了别的槽函数,我一直说的是在button执行完又再次执行了别的槽函数,但是我想拦截别的槽函数,估计你一直没理解我。


现在有两个问题:
1. 大家不明白你遇到的是什么问题
2. 大家不明白你要的具体是什么效果
离线rpdhunter

只看该作者 48楼 发表于: 2013-11-04
我下载了楼主的例子,很简单的一个程序啊,毫无问题,无论怎么点都不会出现崩溃的情况,楼主,是不是你电脑有问题
离线alexltr

只看该作者 49楼 发表于: 2013-11-04
1. 你有提供代码,但你的代码不能很明显的重现你的问题。
2. 你的代码是有设置一个判断值,但你的判断标准是什么?
    在什么情况下是true;什么情况下转换为false?
    按照你的代码, 第一次执行后永远也无法恢复回原来的状态。
    我认为你的代码的结构和算法有问题。


按照我的理解,或是对你的问题的猜想,对你的代码稍做了修改,并加了一个耗时的操作,以重现你的问题。请看附件。
但我觉得3楼的方法就可以实现这样的效果。 code Revised.zip (4 K) 下载次数:11
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
离线foxgod

只看该作者 50楼 发表于: 2013-11-05
回 49楼(alexltr) 的帖子
你修改的正好是我想要的,谢谢,因为我一直不知道QApplication::processEvents();的意义。
离线foxgod

只看该作者 51楼 发表于: 2013-11-05
回 49楼(alexltr) 的帖子
再问个问题,同一个信号对应多个槽函数,这个槽函数执行的顺序是怎么样的呢
离线alexltr

只看该作者 52楼 发表于: 2013-11-05
If several slots are connected to one signal, the slots will be executed one after the other, in the order they have been connected, when the signal is emitted.

詳細請閱讀Qt文檔"Signals & Slots"
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
快速回复
限100 字节
 
上一个 下一个