丢弃点击的 QPushButton
Posted
技术标签:
【中文标题】丢弃点击的 QPushButton【英文标题】:Discarding QPushButton clicked 【发布时间】:2014-05-15 07:53:38 【问题描述】:我正在用 Python 中的 QtGUI 编写一个简单的 GUI,它允许用户通过单击一个按钮 (button1) 来启动一个例程,并且在 10 秒后应该可以选择单击另一个按钮 (button2) 来启动一些例程。我尝试了以下操作:
self.button1=QtGui.QPushButton('Button1',self)
self.button1.clicked.connect(self.button1clicked)
self.button2=QtGui.QPushButton('Button2',self)
self.button2.setEnabled(False)
self.button2.clicked.connect(self.button2clicked)
def button1clicked(self):
self.button2.setEnabled(False)
self.button2.clicked.disconnect()
self.timeNow = time.time()
self.enablebutton2()
def enablebutton2(self):
while(True):
if time.time() - self.timeNow > 10:
self.button2.clicked.connect(self.button2clicked)
self.button2.setEnabled(True)
break
def button2clicked(self):
someroutine()
它似乎工作,该按钮在开始时被禁用,当我点击它时没有任何反应,但是在我点击 button1 并且 10 秒结束之后 button2 接收到我之前所做的所有点击。
这不应该发生,如何确保在禁用 button2 时丢弃所有这些点击?
【问题讨论】:
【参考方案1】:您无需执行self.button2.clicked.disconnect()
,因为您正在禁用按钮2。这本身就足够了。其次,您从button1
的插槽中调用enableButton2()
这是错误的。您在 while 循环中阻塞了主线程 10 秒。这是错误的做事方式。
相反,您应该使用 QTimer
设置时间 10 秒,然后从 button1
的插槽开始。在计时器的插槽中,您可以启用按钮 2。见 QTimer here,以下是 C++ 示例,您可以在 python 中轻松转换它
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
【讨论】:
【参考方案2】:您还连接了 button2 两次……一次是在您创建按钮时,一次是在 enablebutton2 中。只应使用第二个连接。这样即使断开连接语句也不需要。
正如@Abhishek 所述,您需要使用QTimer
,因为您将用户界面阻塞10 秒。 C++ 代码看起来有点像这样
QPushButton *button1 = new QPushButton("Button1");
connect(button1, SIGNAL(clicked()), this, SLOT(button1clicked()));
QPushButton *button2 = new QPushButton("Button1");
button2->setEnabled(false);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(enableButton2()));
button1clicked()
timer->start();
enableButton2()
button2->setEnabled(true);
connect(button2, SIGNAL(clicked()), this, SLOT(button2clicked()));
button2clicked()
someroutine();
【讨论】:
这就是我实际所做的,但我之前连接了 button2,因为每次单击 button1 时,我希望 button2 启用 10 秒。否则在 Python 中也是一样的。以上是关于丢弃点击的 QPushButton的主要内容,如果未能解决你的问题,请参考以下文章