gpt4 book ai didi

python-3.x - 将用户交互与程序更改 : PyQt, QComboBox 分开

转载 作者:行者123 更新时间:2023-12-03 12:20:56 24 4
gpt4 key购买 nike

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

根据在 QComboBoxes 中选择的项目,会显示一些图。这个想法是在线重绘绘图 - 一旦用户更改任何 ComboBox 当前项目。在这里我遇到了一个问题,因为如果每次发出信号 currentIndexChanged 时我都重绘绘图,我也会在初始化期间多次重绘它,并且如果翻译复选框选择发生了变化。

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

最佳答案

您可以尝试几种不同的方法。

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

其次,您可以使用 activated信号,仅在用户选择项目时发送。 (但请注意,与 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_())

关于python-3.x - 将用户交互与程序更改 : PyQt, QComboBox 分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9190376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com