以编程方式切换Python PyQt QPushbutton

5

是否可以通过编程方式切换QPushButton的状态?我有一个可选的QPushButton,用户按下它来启动一个进程。当进程完成后,如何将按钮状态更改为未选中?

runBtn = QPushButton('Run')
runBtn.setCheckable(True)
runBtn.clicked.connect(runProcess)

def runProcess():
    time.sleep(5)
    runBtn.uncheck()    # how should this be done?

标题“以编程方式切换Python PyQt QPushbutton”不准确,应该是“以编程方式释放Python PyQt QPushbutton”。要切换它,可以使用继承的QAbstractButton.toggle()(以及相关/单独的信号toggled)。 - mins
3个回答

3
这应该就能解决问题了。
runBtn.setChecked(False)

尽管这不是理想的行为。切换按钮应该用于打开和关闭事物,而不是表示某些事情正在进行中。如果某些操作需要时间,您应该将光标更改为等待光标,并最好显示进度条/对话框。

2

只需要在您的函数运行完成后调用runBtn.setChecked(False)即可。

正如@hluk在这个回答的评论中指出的那样,任何需要很长时间才能完成的操作都会阻塞界面,这不是一个好主意。在这种情况下最好将其拆分成线程。这可能需要您进行更多的学习,但从长远来看可能是值得的。无论如何,如果您决定使用线程,请在线程运行时使用setEnabled(bool)来禁用按钮的用户输入。


你在那个部分所做的工作不应该花费太多时间,否则GUI线程会被阻塞 - 应用程序将无响应且GUI不会被重绘。你应该在不同的线程中执行任何更昂贵的操作,并使用信号/槽与GUI线程进行通信。 - hluk
这是一个“运行”按钮,用户按下它可以在线程中运行一个进程。再次点击该按钮应该停止该进程。在这种情况下,切换按钮仍然适用吗?我想,当处于选中状态时,单击此按钮可以向正在运行的线程发送信号以执行QThread::quit()操作? - Nyxynyx
@ekhumoro:线程并不提供速度优势,但它们确实意味着GUI在耗时任务期间将保持响应。 - three_pineapples
@Nyxynyx:在这种情况下,您需要检查runBtn按钮的状态,并相应地启动或终止线程。您可以使用runBtn.checked()来获取按钮状态。 - three_pineapples
@three_pineapples。不,这与速度无关。在Python中,如果任务是CPU绑定的(而不是IO绑定的),即使使用线程,GUI仍然会阻塞。必须在单独的进程中运行CPU绑定的任务,以避免出现Python的GIL问题。 - ekhumoro
显示剩余3条评论

1

您可以使用QpushButton和样式表。以下是代码:

if(process==running):
     button.setStyleSheet(ENABLE_STYLESHEET )
else
     button.setStyleSheet(DISABLE_STYLESHEET )

而且您可以按如下方式定义样式表:

ENABLE_STYLESHEET = """
    QPushButton {
        border: 1px solid #007a94;
        border-radius: 6px;
        color:#ffffff;
        background-color: #007a94;
        min-width: 80px;
        }
    QPushButton:pressed {
        background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                  stop: 0 #008aa6, stop: 1 #008aa6);
        }

    QPushButton:flat {
        border: none;
        }
"""    
DISABLE_STYLESHEET = """
    QPushButton {
       border: 1px solid #808080;
       border-radius: 6px;
       color:#ffffff;
       background-color: #808080;
       min-width: 80px;
       }
   QPushButton:flat {
       border: none;
       }

"""

Enable Button Disable Button


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接