选中CheckBox时如何启用LineEdit

时间:2017-01-17 17:00:30

标签: python pyside

我需要在Python中创建一个宏。

我想在检查familyId = rs!FamilyID familyName = rs!FamilyName 时启用QlineEdit;我该怎么做?

这是代码:

QCheckBox

我定义了一个事件来检查import os, sys, App from PySide2 import QtCore, QtGui, QtWidgets from PySide2.QtWidgets import * from PySide2.QtCore import * from PySide2.QtGui import * class Window(QDialog): def __init__(self, parent=None): super(Window, self).__init__(parent) self.fabricatorLineEdit = self.createLineEdit("fabricatorLineEdit", "fabricator") self.fabricatorLineEdit.setDisabled(True) self.chBoxFab = self.createCheckBox("chBoxFab", "Insert a alternative value to 'fabricator' key:") self.chBoxFab.stateChanged.connect(self.chbxStateChange(self.chBoxFab, self.fabricatorLineEdit)) self.chBoxPrjManager = self.createCheckBox("chBoxPrjManager", "Insert a alternative value to 'Project Manager' key:") self.projManagerLineEdit = self.createLineEdit("projManagerLineEdit", "Project Manager") self.projManagerLineEdit.setDisabled(True) self.chBoxPrjManager.stateChanged.connect(self.chbxStateChange(self.chBoxPrjManager , self.projManagerLineEdit)) mainLayout = QtWidgets.QFormLayout() mainLayout.addRow(self.chBoxFab) mainLayout.addRow(self.fabricatorLineEdit) mainLayout.addRow(self.chBoxPrjManager) mainLayout.addRow(self.projManagerLineEdit) self.setLayout(mainLayout) def createLineEdit(self, objName, defaultTxt): lineEdit = QtWidgets.QLineEdit(self) lineEdit.setObjectName(objName) lineEdit.setText(defaultTxt) return lineEdit def createCheckBox(self, objName, objCaption): chBox = QtWidgets.QCheckBox(self) chBox.setObjectName(objName) chBox.setText(objCaption) return chBox def chbxStateChange(self, chBox, lineEdit): if chBox.isChecked: lineEdit.setDisabled(False) else: lineEdit.setDisabled(True) if __name__ == '__main__': import sys window = Window() result = window.exec_() 的状态以启用QCheckBox,但它不起作用:

QlineEdit

我理解问题出在函数 def chbxStateChange(self, chBox, lineEdit): if chBox.isChecked: lineEdit.setDisabled(False) else: lineEdit.setDisabled(True) 中,但我不知道如何解决它。

错误:

  

错误返回,无异常设置   回溯(最近一次调用最后一次):文件“C:/ Program   文件/.../ Python / Scripts / test.py“,第332行,in               window = Window()文件“C:/ Program Files /.../ Python / Scripts / test.py”,第35行, init

     

self.chBoxFab.stateChanged.connect(self.chbxStateChange(self.chBoxFab,   self.fabricatorLineEdit))

1 个答案:

答案 0 :(得分:0)

您的代码中有两个错误。

首先,connect信号方法采用可调用对象,但是您的代码传入方法的返回值(在这种情况下是None)。所以相反,你应该建立这样的连接:

self.chBoxFab.stateChanged.connect(
    lambda: self.chbxStateChange(self.chBoxFab,
                                 self.fabricatorLineEdit))

self.chBoxPrjManager.stateChanged.connect(
    lambda: self.chbxStateChange(self.chBoxPrjManager,
                                 self.projManagerLineEdit))

其次,chbxStateChange方法将isChecked视为属性(而不是调用它)会产生相反的错误,这意味着它将始终评估为True。相反,代码应如下所示:

def chbxStateChange(self, chBox, lineEdit):
    if chBox.isChecked():
        lineEdit.setDisabled(False)
    else:
        lineEdit.setDisabled(True)

但是,如果您只想切换行编辑的启用状态,则此代码过于复杂。可以这样建立连接:

self.chBoxFab.toggled.connect(self.fabricatorLineEdit.setEnabled)
self.chBoxPrjManager.toggled.connect(self.projManagerLineEdit.setEnabled)

toggled signal发送按钮的已检查状态(TrueFalse),然后可以直接设置行编辑的启用状态。 (如果您想在选中按钮时将行编辑设为已停用,则可以将toggled连接到setDisabled

如果您以这种方式执行操作,则不再需要chbxStateChange方法。

(注意:QCheckBox类继承了QAbstractButton,这是获取toggled信号的地方。