在Pyside中执行功能期间等待按钮单击

时间:2014-05-25 19:30:04

标签: python qt user-interface pyside qtgui

我有多个按钮。当我单击其中一个时,我调用一个迭代表行的函数(例如,更改行的背景颜色)。在执行此功能的过程中,在迭代过程中,我希望"暂停"并等待另一个按钮被单击以恢复该功能的执行。在这期间"暂停"我希望禁用或忽略所有其他按钮(即我 等待点击的按钮)。

我已经查看了QTimer和QThread,但我认为我不必要地过度复杂化了。寻找建议......

2 个答案:

答案 0 :(得分:3)

首先,您需要在迭代结束或开始时调用QtGui.qApp.processEvents()方法,以便在执行循环期间使gui响应。然后,您需要维护list行(例如,self.allRows),在每次迭代中,list中的一行更改背景颜色并将其附加到第二行{{1} (比如,list)。如果self.doneRows为{{1},也在False内声明一个布尔变量self.pause = False(例如__init__)并在循环开头添加一个check语句},self.pause循环。然后,您需要添加一个插槽以将True的值更新为True。

break

self.pause按钮的点击信号连接到此插槽。现在循环将被破坏,def pause_execution(self): self.pause = True # loop through all the buttons to make them disabled excluding the pause and resume buttons for btn in self.buttons: btn.setEnabled(False) QtGui.qApp.processEvents() 仅包含尚未更改背景颜色的行。创建另一个槽以再次恢复循环。这次循环将改变剩余行的背景颜色。

Pause

答案 1 :(得分:2)

我认为你正在寻找for this来执行每个方法,具体取决于鼠标按钮点击:

myWidget.setDisabled(true)

然后,您可以找到主窗口的所有子项或根小部件,this way

widgets = form.findChildren(QtGui.QWidget)

然后,您可以按下按钮单击所需的方法,如下所示:

button.clicked.connect(setDisableWidgets)

所以,这是一个简单的例子:

import sys
from PySide.QtCore import *
from PySide.QtGui import *

g_disable = true
g_mainWidget = ...

def setDisableWidgets():
    ''' This will get more exciting when you have other widgets, too,  for sure '''
    widgets = mainWidget.findChildren(QtGui.QWidget)

    for widget in widgets:
        # filter out push button though based objectName for instance
        widget.setDisabled(disable)

    # Toggle for the next run
    disable = not disable

app = QApplication(sys.argv)
button = QPushButton("Click me")
button.clicked.connect(setDisableWidgets)
button.show()
app.exec_()

在你的QThread运行中,你可以扩展运行该函数的代码,例如在处理每一行之后检查禁用变量,如果你愿意,甚至是小单位,如果是,则运行QThread。睡觉(100)左右,然后醒来检查禁用。如果是假,则继续执行,否则休眠。

这是伪代码:

class MyThread (QThread):
    def run():
        isEnd = false
        while not isEnd:
            while disable:
                self.msleep(200)
            # Process next row
            # if we are done, isEnd = true