丢弃点击的 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的主要内容,如果未能解决你的问题,请参考以下文章

根据点击位置丢弃 NSWindow 上的鼠标事件

jenkins丢弃旧的构建及常用操作

模拟丢弃文件事件

Java:允许在我的库存中进行丢弃操作?

《动手学深度学习》丢弃法(dropout)

cmd丢弃旧的副本啥意思