Python 3.x 将用户交互与程序更改分开:PyQt、QComboBox

Python 3.x 将用户交互与程序更改分开:PyQt、QComboBox,python-3.x,pyqt,pyqt4,signals-slots,qcombobox,Python 3.x,Pyqt,Pyqt4,Signals Slots,Qcombobox,我的PyQt4/Python3 GUI中有几个QComboxes,它们在初始化过程中被数据库中的一些条目填充。初始CurrentIndex设置为0。还有一个勾选框,用于更改我的组合框中项目的语言。为了保留当前用户选择,我将当前项目的索引备份,并在用翻译后的项目填写组合框后将CurrentIndex设置为此数字。所有这些动作都会发出currentIndexChanged信号 根据QComboxes中选择的项目,将显示一些绘图。其想法是在线重新绘制绘图-只要用户更改任何ComboBox当前项。这里我

我的PyQt4/Python3 GUI中有几个QComboxes,它们在初始化过程中被数据库中的一些条目填充。初始CurrentIndex设置为0。还有一个勾选框,用于更改我的组合框中项目的语言。为了保留当前用户选择,我将当前项目的索引备份,并在用翻译后的项目填写组合框后将CurrentIndex设置为此数字。所有这些动作都会发出currentIndexChanged信号

根据QComboxes中选择的项目,将显示一些绘图。其想法是在线重新绘制绘图-只要用户更改任何ComboBox当前项。这里我有一个问题,因为如果每次发出信号CurrentIndexchange时我都会重新绘制绘图,那么在初始化期间我也会重新绘制几次,如果转换勾选框的选择发生了变化


区分这些案例的最佳方法是什么?原则上,我需要将编程的当前索引更改与用户分开,并且仅在以后的情况下更新绘图(在GUI初始化期间,我可以编程地调用一次更新绘图函数)。我应该写/重写任何信号吗?如果是这样的话,我以前从未这样做过,我欢迎任何提示或一个好的例子。使用另一个信号?或者有一种方法可以暂时阻止所有信号?

有几种不同的方法可以尝试

首先,您可以确保在连接信号之前完成所有初始化

其次,您可以使用该信号,该信号仅在用户选择项目时发送。(但请注意,与此不同,即使索引没有更改,也会发送此信号)

第三,当当前索引以编程方式更改时,可以使用临时停止发送任何信号

下面的脚本演示了这些可能性:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QVBoxLayout(self)
        self.combo = QtGui.QComboBox()
        self.combo.setEditable(True)
        self.combo.addItems('One Two Three Four Five'.split())
        self.buttonOne = QtGui.QPushButton('Change (Default)', self)
        self.buttonOne.clicked.connect(self.handleButtonOne)
        self.buttonTwo = QtGui.QPushButton('Change (Blocked)', self)
        self.buttonTwo.clicked.connect(self.handleButtonTwo)
        layout.addWidget(self.combo)
        layout.addWidget(self.buttonOne)
        layout.addWidget(self.buttonTwo)
        self.changeIndex()
        self.combo.activated['QString'].connect(self.handleActivated)
        self.combo.currentIndexChanged['QString'].connect(self.handleChanged)
        self.changeIndex()

    def handleButtonOne(self):
        self.changeIndex()

    def handleButtonTwo(self):
        self.combo.blockSignals(True)
        self.changeIndex()
        self.combo.blockSignals(False)

    def changeIndex(self):
        index = self.combo.currentIndex()
        if index < self.combo.count() - 1:
            self.combo.setCurrentIndex(index + 1)
        else:
            self.combo.setCurrentIndex(0)

    def handleActivated(self, text):
        print('handleActivated: %s' % text)

    def handleChanged(self, text):
        print('handleChanged: %s' % text)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
从PyQt4导入QtGui,QtCore
类窗口(QtGui.QWidget):
定义初始化(自):
QtGui.QWidget.\uuuuu init\uuuuuuu(self)
layout=QtGui.QVBoxLayout(self)
self.combo=QtGui.QComboBox()
self.combo.setEditable(True)
self.combo.addItems('一两三四五'.split())
self.buttone=QtGui.QPushButton(‘更改(默认)’,self)
self.buttone.clicked.connect(self.handleButtonOne)
self.buttonTwo=QtGui.QPushButton('Change(Blocked'),self)
self.buttontw.clicked.connect(self.handlebuttontw)
layout.addWidget(self.combo)
layout.addWidget(self.buttone)
layout.addWidget(self.buttonTwo)
self.changeIndex()
self.combo.activated['QString'].connect(self.handleActivated)
self.combo.currentIndexChanged['QString'].connect(self.handleChanged)
self.changeIndex()
def手柄按钮(自身):
self.changeIndex()
def手柄按钮两(自):
self.combo.blockSignals(真)
self.changeIndex()
self.combo.blockSignals(假)
def更改索引(自身):
index=self.combo.currentIndex()
如果索引
非常感谢您的精彩演示!我拿了块信号解决方案。顺便说一句,如果我使用QT设计器而不是像您在示例中所做的那样使用程序布局,那么“确保在连接信号之前完成所有初始化”是否真的可能?在哪一点信号被激活?@Katya。使用Qt Designer,您只能将预先存在的信号连接到预先存在的插槽(与您自己的处理程序相反)。因此,在实践中,几乎所有信号都需要在gui设置后连接(除非应用程序非常简单)。就我个人而言,我只使用Qt Designer来布置gui,很少使用它来连接信号。