• 【PyQt学习篇 · ⑨】:QWidget -控件交互


    是否可用

    1. setEnabled(bool):该函数用于设置QWidget控件的可用性,参数bool为True表示该控件为可用状态,False表示该控件为不可用状态。当控件处于不可用状态时,该控件将无法响应用户的交互事件。

    2. isEnabled():该函数用于获取QWidget控件的当前可用状态,返回值为一个bool类型,True表示该控件为可用状态,False 表示该控件为不可用状态。

    以下为代码示例:

    from PyQt5.QtWidgets import *
    import sys
    
    app = QApplication(sys.argv)
    
    window = QWidget()
    window.resize(300, 300)
    btn = QPushButton(window)
    btn.setText('按钮')
    
    # 设置按钮为不可用
    btn.setEnabled(False)
    print(btn.isEnabled())  # 获取当前按钮是否可用的状态,并打印出来
    
    window.show()
    
    sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行结果:
    观察一下打印结果,按钮设置为不可用之后会颜色会变暗,且不能被点击。

    在这里插入图片描述
    在这里插入图片描述

    是否显示/隐藏

    1. setVisible(bool)(或setHidden(bool)):这个函数用于设置QWidget控件的可见状态。当参数bool为True时,控件将会显示出来;当参数bool为False时,控件将会隐藏起来。

    2. show():这个函数将会显示QWidget控件。相当于调用setVisible(True)

    3. hide():这个函数将会隐藏QWidget控件。相当于调用setVisible(False)

    4. isHidden():这个函数返回一个bool值,表示当前QWidget控件是否处于隐藏状态。如果返回值为True,表示控件被隐藏;如果返回值为False,表示控件可见。

    5. isVisible():这个函数返回一个bool值,表示当前QWidget控件是否处于可见状态。如果返回值为True,表示控件可见;如果返回值为False,表示控件隐藏。

    6. isVisibleTo(widget):这个函数用于检查QWidget控件是否对另一个特定的widget可见。(父控件显示的时候,子控件是否会跟着显示)它接受一个widget作为参数,返回一个bool值表示控件是否对该widget可见。

    注意:

    • visibel:代表控件最终的状态,是否被我们所减(被其他控件遮挡也属于可见)
    • hide:可理解为相对于父控件是否可见

    以下为代码示例:

    from PyQt5.QtWidgets import *
    import sys
    
    
    class Window(QWidget):
        # 重写绘制事件
        def paintEvent(self, QPaintEvent):
            print('窗口被绘制')
            return super().paintEvent(QPaintEvent)
    
    class Btu(QPushButton):
        # 重写绘制事件
        def paintEvent(self, QPaintEvent):
            print('按钮被绘制')
            return super().paintEvent(QPaintEvent)
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
    
        window = Window()
        window.resize(300, 300)
    
        btu = Btu(window)
        btu.setText('按钮')
    
        btu.setVisible(False)
        # 打印父控件如果显示的时候,子控件是否跟着被显示
        print(btu.isVisibleTo(window))
    
        window.show()
    
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    运行结果:
    可以看到按钮已经被隐藏

    在这里插入图片描述
    在这里插入图片描述

    是否编辑

    设置窗口标题xxx[*]

    1. setWindowModified(bool):这个函数用于设置QWidget控件的编辑状态。当参数bool为True时,控件将会被视为已编辑;当参数bool为False时,控件将不再被视为已编辑。

    2. isWindowModified():这个函数返回一个bool值,表示当前QWidget控件是否处于编辑状态。如果返回值为True,表示控件已经被编辑过;如果返回值为False,表示控件未被编辑。

    代码示例:

    from PyQt5.QtWidgets import *
    import sys
    
    app = QApplication(sys.argv)
    
    window = QWidget()
    window.setWindowTitle('[*]交互状态')
    window.resize(300, 300)
    
    window.setWindowModified(True)  # 设置窗口可编辑状态
    print(window.isWindowModified())
    
    window.show()
    sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行结果:

    在这里插入图片描述

    是否为活跃窗口

    活跃窗口是用户当前正在与之交互的窗口,例如正在编辑文本、接收键盘输入或执行操作。

    isActiveWindow(): 这个函数用于检查QWidget控件是否为活跃窗口。如果控件是当前应用程序激活的窗口,即接收键盘和鼠标事件的窗口,则函数返回True;否则返回False。

    代码示例:

    from PyQt5.QtWidgets import *
    import sys
    
    app = QApplication(sys.argv)
    
    w1 = QWidget()
    w1.resize(300, 300)
    w1.setWindowTitle('w1')
    
    w2 = QWidget()
    w2.resize(400, 200)
    w2.setWindowTitle('w2')
    
    w1.show()
    w2.show()
    
    w1.raise_()     # 将w1窗口设为顶层窗口
    
    print(w1.isActiveWindow())      # 打印w1是否为活跃窗口
    print(w2.isActiveWindow())      # 打印w2是否为活跃窗口
    
    sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    运行结果:
    从下图中我们看到,即使使用了raise_()将w1窗口设置为顶层窗口,但是w1却不是活跃窗口(标题栏为灰色)。

    在这里插入图片描述
    在这里插入图片描述

    关闭

    1. close():这个函数用于关闭QWidget控件,使其不可见。调用该函数时会触发 closeEvent() 函数,您可以在该函数中执行额外的操作,例如先隐藏控件,等待异步操作完成后再关闭。

    2. setAttribute(Qt.WA_DeleteOnClose, True):这个函数就是告诉 PyQt 在控件关闭后将其删除。由于控件在关闭时不会自动删除,因此需要在退出函数closeEvent()中调用 deleteLater() 函数或手动删除控件。

    代码示例:

    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import Qt
    import sys
    
    app = QApplication(sys.argv)
    
    window = QWidget()
    window.resize(300, 300)
    
    btn = QPushButton(window)
    btn.setText('按钮')
    
    btn.destroyed.connect(lambda: print('按钮被销毁'))   # 绑定销毁事件,若按钮被销毁则打印“按钮被销毁”
    
    #### 测试代码区 ####
    
    #### 测试代码区 ####
    
    window.show()
    sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    下面将再测试代码区中编写测试API的代码:

    btn.close()
    print(btn.isHidden())
    
    • 1
    • 2

    运行结果:
    按钮已被隐藏,控制台输出True,按钮被隐藏而没有被释放。

    在这里插入图片描述
    在这里插入图片描述

    btn.setAttribute(Qt.WA_DeleteOnClose, True)
    btn.close()
    
    • 1
    • 2

    运行结果:

    在这里插入图片描述
    在这里插入图片描述

    综合案例

    案例:创建一个窗口,包含一个文本框和一个按钮以及一个标签。

    要求:

    • 默认状态:标签隐藏;文本框和按钮显示;按钮设置为不可用状态。
    • 当文本框有内容时,标签显示登录,让按钮可用,否则不可用。
    • 当文本框内容为PyQt5时,点击按钮则显示标签,并展示文本为登录成功,否则为失败。

    涉及知识点:

    • 文本框的创建:QLineEdit
    • 文本框监测内容变更:textChanged信号
    • 文本框内容的获取:text()方法
    • 按钮状态的设置

    综合案例的代码:

    from PyQt5.QtWidgets import *
    import sys
    
    
    class Window(QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            self.setWindowTitle("综合案例")
            self.resize(300, 300)
    
            self.setup_ui()
    
        def setup_ui(self):
            self.label = QLabel(self)
            self.label.setStyleSheet('background-color: cyan;')
            self.label.move(100, 50)
            self.label.hide()
    
            self.lineEdit = QLineEdit(self)
            self.lineEdit.move(100, 100)
            self.lineEdit.textChanged.connect(self._textChanged)    # 文本框文本改变事件绑定
    
            self.btu = QPushButton(self)
            self.btu.setText('按钮')
            self.btu.move(100, 150)
            self.btu.setEnabled(False)
            self.btu.pressed.connect(self._btuPressed)
    
        def _textChanged(self):
            self.label.show()
            self.label.setText('登录')
            self.label.adjustSize()
            if len(self.lineEdit.text()) > 0:
                self.btu.setEnabled(True)
            else:
                self.label.hide()
    
        def _btuPressed(self):
            self.label.show()
            if self.lineEdit.text() == 'PyQt5':
                self.label.setText('登录成功')
            else:
                self.label.setText('登录失败')
    
            self.label.adjustSize()     # 将标签设置为自适应
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
    
        window = Window()
        window.show()
    
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    运行结果:

    在这里插入图片描述

    信息提示

    状态提示

    1. statusTip()函数:

      • 它用于获取控件的状态提示信息,返回一个字符串。
      • 示例:tooltip = button.statusTip()
    2. setStatusTip(str)函数:

      • 它用于设置控件的状态栏提示信息。
      • 示例:button.setStatusTip('Press this button to do something cool!')

    示例代码:

    from PyQt5.QtWidgets import *
    import sys
    
    
    app = QApplication(sys.argv)
    
    window = QMainWindow()      # 懒加载,用到的时候才会创建
    window.setWindowTitle('信息案例')
    window.resize(300, 300)
    
    window.statusBar()  # 设置状态栏
    window.setStatusTip('这是一个窗口')   # 设置状态栏提示信息
    
    window.show()
    
    sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    运行结果:

    在这里插入图片描述
    在以上代码中使用QMainWindow()是因为它是PyQt中提供的一个主窗口类,适用于创建带有菜单栏、工具栏、状态栏和中央部件的应用程序窗口。

    工具提示

    1. toolTip() 函数:

      • 它用于获取控件的工具提示信息,返回一个字符串。
      • 示例:tooltip = button.toolTip()
    2. setToolTip(str) 函数:

      • 它用于设置控件的工具提示信息。
      • 示例:button.setToolTip('This is a button')

    工具提示持续时间:

    • 工具提示可以设置它们在屏幕上显示的持续时间。
    • 默认情况下,工具提示将持续一段时间后自动消失。
    1. toolTipDuration() 函数:

      • 它用于获取工具提示的持续时间,以毫秒为单位。
      • 示例:duration = QToolTip.toolTipDuration()
    2. setToolTipDuration(msec) 函数:

      • 它用于设置工具提示的持续时间,以毫秒为单位。
      • 示例:QToolTip.setToolTipDuration(5000)

    示例代码:

    from PyQt5.QtWidgets import *
    import sys
    
    
    app = QApplication(sys.argv)
    
    window = QMainWindow()
    window.setWindowTitle('信息案例')
    window.resize(300, 300)
    
    label = QLabel(window)
    label.setText('标签')
    
    label.setToolTip('这是一个标签')  # 设置标签工具提示信息
    print(label.toolTip())  # 打印工具提示信息
    
    label.setToolTipDuration(2000)  # 设置标签工具提示信息为2秒
    print(label.toolTipDuration())  # 打印工具提示信息的时间
    
    window.show()
    sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行结果:

    在这里插入图片描述
    在这里插入图片描述

    “这是什么”提示

    1. whatsThis() 函数:

      • 它用于获取控件的“这是什么”提示信息,返回一个字符串。
      • 示例:wts = button.whatsThis()
    2. setWhatsThis(str) 函数:

      • 它用于设置控件的“这是什么”提示信息。
      • 示例:button.setWhatsThis('This is a button')

    示例代码:

    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import Qt
    import sys
    
    
    app = QApplication(sys.argv)
    
    window = QMainWindow()
    window.setWindowTitle('信息案例')
    window.resize(300, 300)
    
    window.setWindowFlags(Qt.WindowContextHelpButtonHint)
    
    label = QLabel(window)
    label.setText('标签')
    label.adjustSize()
    
    label.setWhatsThis('这是什么标签')
    print(label.whatsThis())    # 打印“这是什么”提示信息
    
    window.show()
    sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    运行结果:
    点击窗口标题栏中的“?”,将鼠标移动到标签并点击,点击后即出现“这是什么”提示信息。

    在这里插入图片描述
    以上代码中使用了 window.setWindowFlags(Qt.WindowContextHelpButtonHint) 这行代码来设置窗口标志,其作用是在窗口的标题栏右侧添加一个帮助按钮,也就是包含一个问号图标并显示"What’s This"文本的帮助按钮,用于提供更多的上下文相关帮助信息。

    焦点控制

    在 PyQt 中,焦点控制是指应用程序中各个控件接收焦点的方式和顺序。焦点控制允许用户使用键盘或鼠标与特定控件进行交互。下面是一些在 PyQt 中实现焦点控制的方法和技术。

    单个控件角度

    1. setFocus() 函数:

      • 它用于将焦点设置到特定控件上,使该控件成为接收键盘输入的目标。
      • 示例:widget.setFocus()
    2. setFocusPolicy(Policy) 函数:

      • 它用于设置控件的焦点策略,即定义用户如何通过键盘或鼠标与控件交互。
      • 可选的焦点策略包括:
        • Qt.TabFocus:通过 Tab 键进行切换焦点。
        • Qt.ClickFocus:通过点击鼠标进行设置焦点。
        • Qt.StrongFocus:允许通过 Tab 键和点击鼠标进行焦点设置。
        • Qt.NoFocus:控件不接收焦点。
      • 示例:widget.setFocusPolicy(Qt.TabFocus)
    3. clearFocus() 函数:

      • 它用于清除控件上的焦点,使控件不再处于焦点状态。
      • 示例:widget.clearFocus()

    示例代码:

    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import Qt
    import sys
    
    
    app = QApplication(sys.argv)
    
    window = QWidget()
    window.setWindowTitle('焦点控制')
    window.resize(300, 300)
    
    le1 = QLineEdit(window)
    le1.move(50, 50)
    
    le2 = QLineEdit(window)
    le2.move(50, 100)
    
    le3 = QLineEdit(window)
    le3.move(50, 150)
    
    window.show()
    sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    运行结果:
    以上代码没有设置获取焦点的策略,默认情况下运行程序,第一个文本框会获得焦点,且按下Tab键可切换焦点。

    在这里插入图片描述

    在以上代码的基础上设置le2获取焦点的策略为通过Tab键获取焦点:

    le2.setFocusPolicy(Qt.TabFocus)
    
    • 1

    运行结果:
    鼠标点击le2并不能获取到焦点,而点击le3可获取到焦点,只有通过Tab键才能让le2获取焦点。

    在这里插入图片描述

    父控件角度

    1. focusWidget() 函数:

      • 使用此函数可以查找当前具有焦点的子控件。
      • 示例:parent.focusWidget()
    2. focusNextChild() 函数:

      • 使用此函数可以将焦点从当前具有焦点的子控件移动到下一个子控件。
      • 示例:parent.focusNextChild()
    3. focusPreviousChild() 函数:

      • 使用此函数可以将焦点从当前具有焦点的子控件移动到上一个子控件。
      • 示例:parent.focusPreviousChild()
    4. focusNextPrevChild(bool) 函数:

      • 使用此函数可以根据当前具有焦点的子控件,将焦点移动到下一个或上一个子控件。
      • 当参数为 true 时,向下查找下一个子控件;当参数为 false 时,向上查找上一个子控件。
      • 示例:parent.focusNextPrevChild(True)
    5. setTabOrder(pre_widget, next_widget) 函数:

      • 使用此函数可以设置两个控件之间的 Tab 键顺序,按下 Tab 键时焦点会从第一个控件切换到第二个控件。
      • 示例:QWidget.setTabOrder(widget1, widget2)

    示例1代码

    from PyQt5.QtWidgets import *
    import sys
    
    class Window(QWidget):
        def mousePressEvent(self, QPressEvent):
            print('获取焦点的控件:', self.focusWidget())
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
    
        window = Window()
        window.resize(300, 300)
    
        le1 = QLineEdit(window)
        le1.move(50, 0)
        print('le1对象:', le1)
    
        le2 = QLineEdit(window)
        le2.move(50, 50)
    
        le3 = QLineEdit(window)
        le3.move(50, 100)
    
        window.show()
        # 获取当前窗口内部,所有子控件当中获取焦点的那个控件
        print(window.focusWidget())
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    运行结果:

    在这里插入图片描述
    在这里插入图片描述
    窗口显示时,焦点为None的原因:初始焦点未明确设置时,窗口显示时焦点会默认为None,也就是执行到window.show()的时候所有子控件都没有获取到焦点,而往后继续执行的过程中,第一个子控件才获取到焦点。

    示例2代码:

    from PyQt5.QtWidgets import *
    import sy
    
    app = QApplication(sys.argv)
    
    window = QWidget()
    window.resize(300, 300)
    
    le1 = QLineEdit(window)
    le1.move(50, 0)
    
    le2 = QLineEdit(window)
    le2.move(50, 50)
    
    le3 = QLineEdit(window)
    le3.move(50, 100)
    
    # 设置获取焦点规则
    window.setTabOrder(le1, le3)
    window.setTabOrder(le3, le2)
    
    window.show()
    
    sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    运行结果:

    在这里插入图片描述

  • 相关阅读:
    java毕业生设计忆居民宿管理计算机源码+系统+mysql+调试部署+lw
    【EI会议征稿】第二届可再生能源与电气科技国际学术会议(ICREET 2023)
    Coursera Algorithm Ⅱ week5 Burrows Wheeler
    语法基础(变量、输入输出、表达式与顺序语句)
    【算法】选择排序
    低代码:数智化助力新农业发展
    建立密切业务合作关系,供应商SRM系统助力企业做好新材料供应商品质管控
    PC应用管理工具 连接流程图 支持所有android手机或设备 批量设备批量应用安装卸载等管理 OS升级 push文件夹等
    [SDK]Unity接入Sign in with Apple
    【图像分割】基于模拟退火结合粒子群算法优化图像分割含Matlab代码
  • 原文地址:https://blog.csdn.net/Oh_Python/article/details/134141106