已单击丢弃QPushButton

2024-03-29 06:37:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python编写了一个简单的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()

它似乎起作用了,按钮在一开始是禁用的,当我点击它时什么也没有发生,但是当我点击按钮1和10秒结束按钮2接收到我之前所做的所有点击。在

这不应该发生,当按钮2被禁用时,我如何确保所有的点击都被丢弃?


Tags: selffalsetimedefconnect按钮例程qtgui
2条回答

您不需要做self.button2.clicked.disconnect(),因为您正在禁用按钮2。这本身就足够了。第二,从button1的插槽调用enableButton2(),这是错误的。在while循环中阻塞主线程10秒。这是错误的做事方式。在

相反,您应该使用QTimer设置时间10秒,并从button1的插槽开始。在计时器的插槽中,您可以启用按钮2。参见qTimehere,下面是C++示例,可以轻松地在python中转换它

 QTimer *timer = new QTimer(this);
 connect(timer, SIGNAL(timeout()), this, SLOT(update()));
 timer->start(1000);

你还连接了两次按钮2。。。创建按钮时一次,然后在enablebutton2中再次执行。只应使用第二个连接。这样就不需要断开连接语句。在

同样,正如@Abhishek所说,您需要使用QTimer,因为您要阻塞UI 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();
}

相关问题 更多 >