【问题标题】:Programmatically Toggle a Python PyQt QPushbutton以编程方式切换 Python PyQt QPushbutton
【发布时间】:2013-10-30 18:25:03
【问题描述】:

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

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

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

【问题讨论】:

  • 标题“Programmatically Toggle a Python PyQt QPushbutton”不准确,应该是“Programmatically Release a Python PyQt QPushbutton”。要切换它,有继承的QAbstractButton.toggle()(以及关联/单独的信号toggled

标签: python qt python-2.7 pyqt pyqt4


【解决方案1】:

这应该是诀窍。

runBtn.setChecked(False)

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您在该部分中所做的工作不应花费太多时间,否则 GUI 线程将被阻塞——应用程序将不会响应并且 GUI 不会被重绘。您应该在不同的线程中做任何更昂贵的事情,并使用信号/插槽与 GUI 线程进行通信。
    • @hluk:你当然是对的!我已经习惯于自己一直做多线程的事情,我忘记了这里不是这种情况。我会更新我的回复!
    • 如果耗时的任务受 CPU 限制(因为 python 的 GIL),线程将不会提供任何好处 - 为此需要多处理。
    • 它是一个运行按钮,用户按下它可以在线程中运行一个进程。再次单击该按钮应停止该过程。在这种情况下,切换按钮是否仍然适用?我想在选中状态下单击此按钮可以向正在运行的线程发送信号以执行 QThread::quit()?
    • @ekhumoro:线程不提供速度优势,但它们确实意味着 GUI 将在耗时的任务期间做出响应。
    【解决方案3】:

    您可以使用 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;
           }
    
    """
    

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 1970-01-01
      • 2012-02-01
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2011-12-25
      • 2011-07-13
      相关资源
      最近更新 更多