控件交互
- 控件是否可用(设置/获取)
- 控件可见隐藏(设置/获取)
- 控件是否编辑状态(设置/获取)
- 是否活跃窗口(获取)
- 关闭控件
- 信息提示
- 焦点控制
- 控件是否可用
setEnabled(bool) # 设置控件是否可用(True / False) isEnabled() # 返回控件是否可用(True / False)
- 当控件设置为不可用状态
控件.setEnabled(False)
时,控件显示为灰色
- 当控件设置为不可用状态
- 控件可见隐藏
setVisible(bool) # 设置控件是否可见(实际是控制是否绘制控件) setHidden(bool) # 设置控件是否隐藏 show() # 展示控件 hide() # 隐藏控件 # setHiddent、show、hide三个方法,底层实际上还是调用的setVisible()方法 isHidden() # 判断控件是否隐藏,一般是基于父控件可见 isVisible() # 获取控件最终状态是否可见 isVisibleTo(widget) # 如果能随着widget控件的显示和影藏,而同步变化则返回True
- 注意:setVisible方法传递的参数值为True也不一定可见(父控件不可见的时候,子控件设置为True也一样不可见)
- 控件绘制过程:先绘制父控件,再绘制子控件。父控件没有绘制,子控件是无法绘制的(即使设置setVisible为True)
- isHidden()判断控件是否隐藏,isVisible()判断控件最终状态是否可见。当子控件是由于父控件不显示而不可见时,子控件.isHidden()返回False,子控件.isVisible()返回False
- 控件是否编辑状态
设置窗口标题xxx[*] # [*] 标准格式 setWindowModified(bool) # 设置控件是否是编辑状态(True:标题栏显示*,False:标题栏不显示*) isWindowModified() # 返回控件是否是编辑状态
- 当控件标题设置为特定格式,并且设置为编辑状态
控件.setWindowModified(True)
时,标题栏上会显示 * (类似于Word在编辑的时,标题栏前面显示带 *)
- 当控件标题设置为特定格式,并且设置为编辑状态
- 是否活跃窗口
isActiveWindow() # 返回窗口是否是活跃窗口(True / False)
- 并不是哪个窗口在最顶层就是哪个窗口为活跃窗口。(控件层级设置,并不会改变其活跃状态)
- 通过
控件.raise_()
将控件上升到最顶层,当前控件并不一定就是活跃窗口 - 通过
控件.lower()
将控件降低到最底层,当前控件并不一定就不是活跃窗口
- 关闭控件
控件.close() # 关闭控件(底层实际是调用的setVisible(False),并没有删除控件) setAttribute(Qt.WA_DeleteOnClose, True) # 设置控件在关闭的时候删除,需要在close()之前设置
close()
在底层实际调用的是setVisible(False)
方法,本质上仅仅是隐藏了控件,并没有删除(释放)控件- 通过
setAttribute(Qt.WA_DeleteOnClose, True)
方法设置,关闭控件的时候删除控件(释放) - 可以通过
控件.destroyed.connect(lambda :print('控件被释放了'))
信号与槽来监测控件是否被释放
案例
- 案例1:创建一个窗口, 包含一个文本框和一个按钮和一个标签
- 要求:
- 默认标签隐藏、文本和按钮显示,按钮设置为不可用状态
- 当文本框有内容时,让按钮可用,否则不可用
- 当文本框内容为Fz时,点击按钮则显示标签,并展示文本为登录成功,否则为失败
- 知识点:
- 文本框的创建:QLineEdit类
- 文本框监测内容变更:textChanged信号
- 文本框内容获取:text()方法
- 控件状态的设置
- 示例代码
from PyQt5.Qt import * import sys class Windows(QWidget): def __init__(self): super().__init__() self.setWindowTitle('控件交互案例') self.resize(500, 500) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): # 创建一个窗口, 包含一个文本框和一个按钮和一个标签 labe = QLabel(self) labe.setText('标签') labe.move(200, 100) ledt = QLineEdit(self) # ledt.setText('文本框') ledt.move(200, 150) btn = QPushButton(self) btn.setText('登录') btn.move(200, 200) # 默认标签隐藏、文本和按钮显示,按钮设置为不可用状态 labe.hide() btn.setEnabled(False) # 当文本框有内容时,让按钮可用,否则不可用 def ledt_cao(text): # if len(text) > 0: # btn.setEnabled(True) # else: # btn.setEnabled(False) # print('文本框内容发生改变') # 0 —— False >0 —— True btn.setEnabled(len(text)) ledt.textChanged.connect(ledt_cao) # 当文本框内容为Fz时,点击按钮则显示标签,并展示文本为登录成功,否则为失败 def btn_cao(): # 1. 获取文本框内容 content = ledt.text() # 2. 判断文本框内容是否为Fz,不管是否都显示标签 labe.show() if content == 'Fz': # 3. 是Fz,显示文本框,内容为 登录成功 labe.setText('登录成功') else: # 4. 不是Fz,显示文本框,内容为 登录失败 labe.setText('登录失败') btn.pressed.connect(btn_cao) if __name__ == '__main__': app = QApplication(sys.argv) w = Windows() w.show() sys.exit(app.exec_())
- 按照要求,代码基本写完。但是在执行的过程中有一点小问题。就是不管文本框输入什么内容,点击按钮后,标签都显示为登录
-
- 原因:开始创建QLabel标签的时候,设置了文本为"标签",此时标签控件的尺寸就限定为两个字符了。
- 解决方法:设置QLabel标签的尺寸属性跟随内容大小
from PyQt5.Qt import * import sys class Windows(QWidget): def __init__(self): super().__init__() self.setWindowTitle('控件交互案例') self.resize(500, 500) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): # 创建一个窗口, 包含一个文本框和一个按钮和一个标签 x = 150 labe = QLabel(self) labe.setText('标签') labe.move(x, 100) ledt = QLineEdit(self) # ledt.setText('文本框') ledt.move(x, 150) btn = QPushButton(self) btn.setText('登录') btn.move(x, 200) # 默认标签隐藏、文本和按钮显示,按钮设置为不可用状态 labe.hide() btn.setEnabled(False) # 当文本框有内容时,让按钮可用,否则不可用 def ledt_cao(text): # if len(text) > 0: # btn.setEnabled(True) # else: # btn.setEnabled(False) # print('文本框内容发生改变') # 0 —— False >0 —— True btn.setEnabled(len(text)) ledt.textChanged.connect(ledt_cao) # 当文本框内容为Fz时,点击按钮则显示标签,并展示文本为登录成功,否则为失败 def btn_cao(): # 1. 获取文本框内容 content = ledt.text() # 2. 判断文本框内容是否为Fz if content == 'Fz': # 3. 是Fz,显示文本框,内容为 登录成功 labe.setText('登录成功') # labe.show() # labe.adjustSize() else: # 4. 不是Fz,显示文本框,内容为 登录失败 labe.setText('登录失败') # labe.show() # labe.adjustSize() # 由于不管内容是什么都要显示标签,所以优化代码 labe.show() # 设置标签大小跟随文本内容(跟随内容)改变 labe.adjustSize() btn.pressed.connect(btn_cao) if __name__ == '__main__': app = QApplication(sys.argv) w = Windows() w.show() sys.exit(app.exec_())