将用户交互与程序化改变分开:PyQt,QComboBox

Kat*_*tya 4 pyqt signals-slots pyqt4 qcombobox python-3.x

我的PyQt4/Python3 GUI中有几个QComboBox,它们在初始化期间填充了数据库中的一些条目.初始CurrentIndex设置为0.还有一个复选框,用于更改组合框中项目的语言.为了保留当前用户选择,我在用已翻译项填充ComboBox后,将当前项的索引和setCurrentIndex备份到此数字.所有这些操作都会发出currentIndexChanged信号.

根据QComboBoxes中选择的项目,显示一些图表.我们的想法是在线重绘图表 - 只要用户更改任何ComboBox当前项目.在这里我遇到了一个问题,因为如果我每次重写信号currentIndexChanged时都会重绘图,我会在初始化期间重新绘制它几次并且如果更改了翻译复选框选项.

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

ekh*_*oro 10

你可以尝试一些不同的东西.

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

其次,您可以使用激活的信号,只有在用户选择项目时才会发送.(但请注意,与currentIndexChanged不同,即使索引未更改,也会发送此信号).

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

这是一个演示这些可能性的脚本:

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_())
Run Code Online (Sandbox Code Playgroud)