【问题标题】:Making QComboBox widgets distinguishable in a for loop using PyQt5使用 PyQt5 使 QComboBox 小部件在 for 循环中可区分
【发布时间】:2018-07-28 23:18:30
【问题描述】:

我在创建QComboBox 小部件网格的应用程序时遇到问题(见下图)。我使用for 循环来创建网格的元素。

QComboBox 网格布局

我希望能够分别处理每个 QComboBox。这是没有尝试这样做的代码:

grid = QGridLayout()
combos = [
'1', '1', '1', '', '1', 
'1', '1', '1', '', '1',
'1', '1', '1', '', '1',
'1', '1', '1', '', '1']

positions = [(i,j) for i in range(5) for j in range(5)]
for position, dcombo in zip(positions, combos):
    if dcombo == '':
        continue
    combo = QComboBox()

    for x in range(0, 30):
        combo.addItem(QIcon("/icons/%d.PNG" % x),"")

    combo.setFixedSize(120,100)
    combo.setIconSize(QSize(100,100))
    grid.addWidget(combo, *position)

    comboList['combo{0}'.format(position)] = position

这是我的尝试,也是我目前卡住的地方:

grid = QGridLayout()
combos = [
'1', '1', '1', '', '1', 
'1', '1', '1', '', '1',
'1', '1', '1', '', '1',
'1', '1', '1', '', '1']

comboList = {}

positions = [(i,j) for i in range(5) for j in range(5)]
for position, drawcombo in zip(positions, combos):
    if drawcombo == '':
        continue
    combo = QComboBox()

    for x in range(0, 30): #
        combo.addItem(QIcon("absolver deck reviewer/icons/%d.PNG" % x),"")

    combo.setFixedSize(120,100)
    combo.setIconSize(QSize(100,100))
    grid.addWidget(combo, *position)

    comboList['combo{0}'.format(position)] = position
    combo.currentIndexChanged.connect(lambda: self.logChange(comboList['combo{0}'.format(position)]))

def logChange(self, currentCombo):
    sender = self.sender()
    print(str(currentCombo) + ' was changed')

print() 方法只返回列表中的最后一个位置(在本例中为 (3, 4) 元组。

【问题讨论】:

    标签: python pyqt pyqt5 qcombobox


    【解决方案1】:

    随着位置变量的变化,这被它覆盖,它只打印最后一个,如果你不希望它被覆盖,你必须将它作为参数传递给 lambda 函数,此外。为此,您还必须将发送信号的变量作为参数传递,在您的情况下使用以下内容:

    combo.currentIndexChanged.connect(
        lambda ix, p=position: self.logChange(comboList['combo{0}'.format(p)]))
    

    【讨论】:

    • 这行得通,非常感谢!我现在面临在 logChange 函数中编辑组合的问题。我没有看到任何方法可以使用位置元组来直接编辑它。
    • 我计划添加不同类型的 ComboBox 并在选择项目时将更改应用于网格。在这种情况下,我需要一种方法来根据其坐标将 QComboBox 替换为另一个。
    • 对不起,我不确定我是否完全理解。你是说我应该在 logChange() 函数中创建另一个 QGridLayout 来用另一个 QComboBox 替换 QComboBox 吗?或者我应该将网格传递给 logChange 函数在那里进行编辑?
    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多