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)
| 归档时间: |
|
| 查看次数: |
12532 次 |
| 最近记录: |