我有多个按钮。当我单击其中一个时,我调用一个迭代表行的函数(例如,更改行的背景颜色)。在执行此功能的过程中,在迭代过程中,我希望"暂停"并等待另一个按钮被单击以恢复该功能的执行。在这期间"暂停"我希望禁用或忽略所有其他按钮(即我 等待点击的按钮)。
我已经查看了QTimer和QThread,但我认为我不必要地过度复杂化了。寻找建议......
答案 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