首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >丢弃QPushButton单击

丢弃QPushButton单击
EN

Stack Overflow用户
提问于 2014-05-15 07:53:38
回答 2查看 204关注 0票数 2

我正在用QtGUI编写一个简单的GUI,它允许用户通过单击一个按钮(button1)来启动一个例程,10秒后应该可以选择单击另一个按钮(button2)来启动一些例程。我试过以下几点:

代码语言:javascript
运行
复制
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时所有这些单击都被丢弃?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-15 08:23:13

您不需要执行self.button2.clicked.disconnect(),因为您正在禁用button2。这本身就足够了。其次,在您从enableButton2()的插槽调用button1时,这是错误的。您正在阻塞主线程10秒在您的时间循环。这样做是错误的。

相反,您应该使用QTimer设置时间10秒,并从button1的时隙启动它。在计时器槽中,您可以启用button2。参见QTimer 这里,下面是C++示例,您可以轻松地在python中转换它。

代码语言:javascript
运行
复制
 QTimer *timer = new QTimer(this);
 connect(timer, SIGNAL(timeout()), this, SLOT(update()));
 timer->start(1000);
票数 0
EN

Stack Overflow用户

发布于 2014-05-15 09:20:49

你也要连接button2两次..。一次是在创建按钮时,然后是在enablebutton2中。只应使用第二个连接。这样,即使是断开语句也不是必需的。

同样,正如@Abhishek所述,当您阻塞UI 10秒时,您需要使用QTimer。C++代码看起来有点像这样

代码语言:javascript
运行
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23672289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档