022.PyQt5_QWidget_控件交互

控件交互

  1. 控件是否可用(设置/获取)
  2. 控件可见隐藏(设置/获取)
  3. 控件是否编辑状态(设置/获取)
  4. 是否活跃窗口(获取)
  5. 关闭控件
  6. 信息提示
  7. 焦点控制

  • 控件是否可用
    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:创建一个窗口, 包含一个文本框和一个按钮和一个标签
  • 要求:
    1. 默认标签隐藏、文本和按钮显示,按钮设置为不可用状态
    2. 当文本框有内容时,让按钮可用,否则不可用
    3. 当文本框内容为Fz时,点击按钮则显示标签,并展示文本为登录成功,否则为失败
  • 知识点:
    1. 文本框的创建:QLineEdit类
    2. 文本框监测内容变更:textChanged信号
    3. 文本框内容获取:text()方法
    4. 控件状态的设置
  • 示例代码
    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_())
    
    • 按照要求,代码基本写完。但是在执行的过程中有一点小问题。就是不管文本框输入什么内容,点击按钮后,标签都显示为登录
    • 022.PyQt5_QWidget_控件交互_第1张图片

    • 原因:开始创建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_())
    

你可能感兴趣的:(PyQt5,qt5,pyqt,python,qt,ui)