python-Qt的多个QLineEdit和QComboBox分别绑定同一个槽时的信息获取

本文探讨了如何在Qt中同时为QLineEdit和QComboBox设置槽函数,包括使用editingFinished信号、sender获取输入值的方法,并介绍了两种获取不同控件输入的策略:通过索引关联和控件实例传递。
摘要由CSDN通过智能技术生成

这个标题可能会有点容易让人弄错,我只不过是想把QLineEdit和QComboBox的绑定处理放在同一标题可能容易让人看错,我只不过是想把QLineEdit和QComboBox的问题放在一篇文章中而已,所以意思是说多个QLineEdit绑定到一个槽函数,多个QComboBox绑定到另外一个槽函数,它们当然是分别处理的。

由于QLineEdit和QComboBox的槽函数形式不一样,所以也是必需分开的,另外还有它们获取内容的方式也不一样,也当然应该是分开说才是对的。

好了,开始言归正传。

不习惯python的语言方式,虽然很灵活,但是看到一个变量无法确定它具体是什么东西,就没有办法很直观地了解它的结构,还有Qt,没有设计界面,只能写代码,确实不太习惯。

一个工具,通过配置文件,允许添加多个输入框和多个下拉选择框,创建这些控件没有问题,下面针对输入框和下拉框分别说明。

先说明一下,下面的代码都是放在一个类中的,所以每个函数的第一个参数都是self。

在此只针对问题的相关情况进行说明,至于界面显示和排版,不在此文的范围内,所以这里就只说问题点及其处理方法。先来段小代码:

def InitUi(self, infoList):
    self.editList = []
    editIndex = 0
    for infoItem in infoList:
        objInput = QLineEdit()
        if infoItem[1] != "":
            objInput.setText(infoItem[1])
        self.editList.append(objInput)

这个很简单,根据输入的infoList创建个数不定的QLineEdit控件,每项中,如果存在值,就把它的值显示在输入框中,所有的输入框加入到控件列表editList中。但这个代码中没有绑定槽函数,为了在完成编辑后及时获取输入的值,我这里采用了 editingFinished 信号,在内容有修改然后失去焦点时,或者按下回车时,将会触发此信号,修改后的代码如下:

def InitUi(self, infoList):
    self.editList = []
    editIndex = 0
    for infoItem in infoList:
        objInput = QLineEdit()
        if infoItem[1] != "":
            objInput.setText(infoItem[1])
        objInput.editingFinished.connect(partial(BoxEditKillFocus, editIndex))
        self.editList.append(objInput)
        editIndex += 1


def BoxEditKillFocus(self, editIndex):
    val = self.sender.text()

这里在绑定的时候,采用了一个偏置函数partial,目的是多一个参数把输入框的索引传进去,因为在我实际的项目中,本文章的代码是在父类中,实际处理的槽函数在子类中,而且输入框在排版中被包含到了多个层级内,我就没有单独把它放到一个列表中,所以这个索引仅用于业务上的联系,而不是专门来和输入框控件去对应的(当然,通过把输入框像在本文中加入一个单独的列表,然后通过索引来确定对应的输入框也是一个方法)。

通过网上搜索,说在槽函数中通过sender可以获取输入值,就像上面那样,但我实际测试时程序是崩溃的,无法获取,sender的函数我也换了几个:text()、getText()、Text()几个都试了,一样崩溃,也就是说,这个sender应该不是输入框自己的实例。如果是这样就有点麻烦,但是转念一想,既然可以把索引传入槽函数,那直接把输入框自己也传进去不就行了?

def InitUi(self, infoList):
    self.editList = []
    editIndex = 0
    for infoItem in infoList:
        objInput = QLineEdit()
        if infoItem[1] != "":
            objInput.setText(infoItem[1])
        objInput.editingFinished.connect(partial(BoxEditKillFocus, editIndex, objInput))
        self.editList.append(objInput)
        editIndex += 1


def BoxEditKillFocus(self, editIndex, objInput):
    val = objInput.text()

这样一试,果然成功,槽函数中,val就是获取的输入内容

下面再说下拉选择框,由于其槽函数直接有当前选中的值,所以比输入框就简单一些,不需要把自己怕实例传入,下面简单贴上实现的代码:

def InitUi(self, infoList):
    self.cbbList = []
    cbbIndex = 0
    for infoItem in infoList:
        objInput = QComboBox()
        objInput.setText(infoItem[1])
        objInput.currentIndexChanged.connect(partial(BoxSelected, cbbIndex))
        self.cbbList.append(objInput)
        cbbIndex += 1


def Boxselected(self, cbbIndex, curVal):
    outString("cbb index is " + str(cbbIndex) + ", value index is " + str(curVal))

在这里,同样把控件的索引当做参数也传进了槽函数,但槽函数中的最后一个参数curVal,是槽函数自带的,也就是当前选中的项的索引。

总体上在同一个被绑定的槽函数中想获取不同控件输入的值有几种方法:

1. 把控件加入列表,在绑定时通过使用偏置函数把控件索引传进槽函数,在槽函数中通过控件索引直接找到是哪一个控件,这样就能直接获取输入的内容了
2. 在绑定时通过使用偏置函数把控件自己的实例传进槽函数,在槽函数中直接通过此控件的实例获取输入的内容

可能还有网上说的通过sender来获取,但我没有去研究,应该也是可行的,只是我不知道如何写罢了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值