pyQT Combobox 更改后的打印输出
pyQT Combobox print output upon changed
我想根据哪个组合框和组合框中的哪一行创建事件(在本例中为打印)。我看了一下 old post 并做了一些扩展。这有意义吗?当我在左侧组合框中按 "second" 时,我想要输出“0, 2”,当我在右侧组合框中按 "second" 时,我想要输出“1, 2”。
from PyQt4 import QtCore, QtGui
import sys
class MyClass(object):
def __init__(self, arg):
super(MyClass, self).__init__()
self.row = arg
self.col = []
def add_column(self, col):
self.col.append(col)
class myWindow(QtGui.QWidget):
def __init__(self, parent=None):
super(myWindow, self).__init__(parent)
comboBox = [None, None]
myObject = [None, None]
slotLambda = [None, None]
for j in range(2):
comboBox[j] = QtGui.QComboBox(self)
if j > 0:
comboBox[j].move(100, 0)
test = [['first', 1], ['second', 2]]
myObject[j] = MyClass(j)
for num, value in test:
comboBox[j].addItem(num)
myObject[j].add_column(value)
slotLambda[j] = lambda: self.indexChanged_lambda(myObject[j])
comboBox[j].currentIndexChanged.connect(slotLambda[j])
@QtCore.pyqtSlot(str)
def indexChanged_lambda(self, string):
print string.row, string.col
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
app.setApplicationName('myApp')
dialog = myWindow()
dialog.show()
sys.exit(app.exec_())
如果使用QComboBox
,则不需要使用lambda函数来发送附加信息,QComboBox
可以为每个索引存储信息,addItem()
有一个附加参数,其中信息可以被保存,我们可以通过 itemData()
方法访问它,我们可以使用 setItemData()
方法添加另一个信息。
要知道 QComboBox 发出了信号,我们可以使用 sender()
,此方法 returns 发出信号的对象。
以上所有内容均在以下示例中实现:
from PyQt4 import QtCore, QtGui
import sys
class myWindow(QtGui.QWidget):
def __init__(self, parent=None):
super(myWindow, self).__init__(parent)
lay = QtGui.QHBoxLayout(self)
test = [['first', 1], ['second', 2]]
for j in range(5):
comboBox = QtGui.QComboBox(self)
lay.addWidget(comboBox)
for i, values in enumerate(test):
text, data = values
comboBox.addItem(text, (j, data))
comboBox.currentIndexChanged.connect(self.onCurrentIndexChanged)
@QtCore.pyqtSlot(int)
def onCurrentIndexChanged(self, ix):
combo = self.sender()
row, column = combo.itemData(ix)
print(row, column)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
app.setApplicationName('myApp')
dialog = myWindow()
dialog.show()
sys.exit(app.exec_())
我想根据哪个组合框和组合框中的哪一行创建事件(在本例中为打印)。我看了一下 old post 并做了一些扩展。这有意义吗?当我在左侧组合框中按 "second" 时,我想要输出“0, 2”,当我在右侧组合框中按 "second" 时,我想要输出“1, 2”。
from PyQt4 import QtCore, QtGui
import sys
class MyClass(object):
def __init__(self, arg):
super(MyClass, self).__init__()
self.row = arg
self.col = []
def add_column(self, col):
self.col.append(col)
class myWindow(QtGui.QWidget):
def __init__(self, parent=None):
super(myWindow, self).__init__(parent)
comboBox = [None, None]
myObject = [None, None]
slotLambda = [None, None]
for j in range(2):
comboBox[j] = QtGui.QComboBox(self)
if j > 0:
comboBox[j].move(100, 0)
test = [['first', 1], ['second', 2]]
myObject[j] = MyClass(j)
for num, value in test:
comboBox[j].addItem(num)
myObject[j].add_column(value)
slotLambda[j] = lambda: self.indexChanged_lambda(myObject[j])
comboBox[j].currentIndexChanged.connect(slotLambda[j])
@QtCore.pyqtSlot(str)
def indexChanged_lambda(self, string):
print string.row, string.col
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
app.setApplicationName('myApp')
dialog = myWindow()
dialog.show()
sys.exit(app.exec_())
如果使用QComboBox
,则不需要使用lambda函数来发送附加信息,QComboBox
可以为每个索引存储信息,addItem()
有一个附加参数,其中信息可以被保存,我们可以通过 itemData()
方法访问它,我们可以使用 setItemData()
方法添加另一个信息。
要知道 QComboBox 发出了信号,我们可以使用 sender()
,此方法 returns 发出信号的对象。
以上所有内容均在以下示例中实现:
from PyQt4 import QtCore, QtGui
import sys
class myWindow(QtGui.QWidget):
def __init__(self, parent=None):
super(myWindow, self).__init__(parent)
lay = QtGui.QHBoxLayout(self)
test = [['first', 1], ['second', 2]]
for j in range(5):
comboBox = QtGui.QComboBox(self)
lay.addWidget(comboBox)
for i, values in enumerate(test):
text, data = values
comboBox.addItem(text, (j, data))
comboBox.currentIndexChanged.connect(self.onCurrentIndexChanged)
@QtCore.pyqtSlot(int)
def onCurrentIndexChanged(self, ix):
combo = self.sender()
row, column = combo.itemData(ix)
print(row, column)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
app.setApplicationName('myApp')
dialog = myWindow()
dialog.show()
sys.exit(app.exec_())