1. 描述
- 所有可视空间的基类
 - 是一个最简单的空白控件
 - 控件是用户界面的最小元素 
  
- 接收各种事件(鼠标、键盘)
 - 绘制在桌面上,显示给用户看
 
 - 每个控件都是矩形的,它们按z轴顺序排序
 - 控件由其父控件和前面的控件剪切
 - 没有父控件的控件,称之为窗口 
  
- 一般会被包装一个框架(标题栏等)
 - 可以通过某些设置更改
 
 
2. 继承
- QObject
 - QPaintDevice
 
3. 功能
3.1 控件的创建
3.1.1 API
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
3.2 大小位置
3.2.1 API
3.2.1.1 获取
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||

3.2.1.1.1 代码
from PyQt5.Qt import *
import sys
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QWidget()
    window.setWindowTitle('位置大小')
    window.resize(500, 500)
    window.move(100, 100)
    # 在窗口显示前获取尺寸信息
    print(window.size())
    print(window.geometry())
    print(window.frameSize())
    print(window.frameGeometry())
    print("--"*20)
    window.show()
    # 在窗口显示之后获取尺寸信息
    print(window.size())
    print(window.geometry())
    print(window.frameSize())
    print(window.frameGeometry())
    sys.exit(app.exec_())
 
运行结果:
 
 注意:控件显示完毕后,具体尺寸数据才会正确
3.2.1.2 设置
3.2.1.1 获取
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.2.1.2 案例
通过给定的的个数, 你负责在一个窗口内创建相应个数的子控件
 要求:按照九宫格的布局进行摆放,一行放给定的列
from PyQt5.Qt import *
import sys
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QWidget()
    window.show()
    window.resize(500, 500)
    window.move(500, 500)
    # 总的控件个数
    widget_count = 500
    # 每一行列的个数
    column_count = 5
    # 计算一个控件的宽度
    widget_width = window.width() / column_count
    # 总共有多少行
    row_count = (widget_count-1)//column_count + 1
    widget_height = window.height() / row_count
    for i in range(0, widget_count):
        w = QWidget(window)
        w.resize(int(widget_width), int(widget_height))
        widget_x = i % column_count * widget_width
        widget_y = i // column_count * widget_height
        w.move(int(widget_x), int(widget_y))
        w.setStyleSheet('background-color: red;border:1px solid yellow;')
        w.show()
    sys.exit(app.exec_())
 
运行结果:(500个控件,每一行放5个控件)
 
3.3 最大和最小尺寸
3.3.1 API
3.3.1.1 获取
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.3.1.2 设置
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.3.1.3 注意
控件完全展示前后会有差异
3.4 内容边距
3.4.1 API
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
注意:必须是控件本身留够对应的大小
3.4.2 应用场景
调整控件内容边距,使得显示更加好看
3.4.3 案例
创建一个窗口,包含一个标签
 要求:
- 标签内容为xujie
 - 标签大小为100, 60
 - 将内容放在标签右下角
 
from PyQt5.Qt import *
import sys
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QWidget()
    window.setWindowTitle('内容边距')
    window.resize(500, 500)
    label = QLabel(window)
    label.setText('xujie')
    label.resize(100, 60)
    label.move(200, 200)
    label.setStyleSheet('background-color: cyan;')
    label.setContentsMargins(60, 40, 0, 0)
    print(label.getContentsMargins())
    window.show()
    sys.exit(app.exec_())
 
运行结果:
 
3.5 鼠标操作
3.5.1 API
3.5.1.1 设置鼠标形状
setCursor(鼠标参数)
 参数:
- Qt.ArrowCursor

 - Qt.UpArrowCursor

 - Qt.CrossCursor

 - Qt.IBeamCursor

 - Qt.WaitCursor

 - Qt.BusyCursor

 - Qt.ForbiddenCursor

 - Qt.PointingHandCursor

 - Qt.WhatsThisCursor

 - Qt.SizeVerCursor

 - Qt.SizeHorCursor

 - Qt.SizeBDiagCursor

 - Qt.SizeAllCursor

 - Qt.SplitVCursor

 - Qt.SplitHCursor

 - Qt.OpenHandCursor

 - Qt.ClosedHandCursor

 - Qt.BlankCursor

 - 自定义
QCurser对象 
3.5.1.2 重置形状
unsetCursor()
3.5.1.3 获取鼠标
cursor() -> QCursor
3.5.1.4 鼠标跟踪
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     ②不跟踪:鼠标移动时,必须处于按下状态,才会触发mouseMoveEvent事件; ③跟踪:鼠标移动时,不处于按下状态,也会触发mouseMoveEvent事件  | ||||||
3.5.1.5 QCursor对象
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.5.2 应用场景
根据特定场景, 设置鼠标样式; 使得用户交互时更加明确
3.5.3 案例
创建一个窗口, 内部有一个label控件
 要求:
- 鼠标移入窗口时, 让label位置跟随鼠标位置
 - 让鼠标设置为指定图标
 
from PyQt5.Qt import *
import sys
class MyWidget(QWidget):
    def mouseMoveEvent(self, a0):
        """重写鼠标移动事件方法"""
        print(a0.localPos())
        label = self.findChild(QLabel)
        label.move(int(a0.localPos().x()), int(a0.localPos().y()))
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWidget()
    window.setWindowTitle('鼠标操作')
    window.resize(500, 500)
    # 设置鼠标跟踪
    if not window.hasMouseTracking():
        window.setMouseTracking(True)
    # 设置一个标签控件
    label = QLabel(window)
    label.setText('我是标签')
    label.setStyleSheet('background-color: cyan;')
    label.move(200, 200)
    # 设置指定图标
    pixmap = QPixmap('img.png').scaled(50, 50)
    cursor = QCursor(pixmap, 10, 10)
    window.setCursor(cursor)
    window.show()
    sys.exit(app.exec_())
 
运行结果:
 
3.6 事件
3.6.1 API
3.6.1.1 显示和关闭事件
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.6.1.2 移动事件
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
3.6.1.3 调整大小
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
3.6.1.4 鼠标事件
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.6.1.5 键盘事件
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.6.1.6 焦点事件
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.6.1.7 拖拽事件
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.6.1.8 绘制事件
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
3.6.1.9 改变事件
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
3.6.1.10 右键菜单
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
3.6.1.11 输入法
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
3.6.2 应用场景
- 当一个控件被触发了一个特定的行为时, 就会调用特定的方法, 来将事件传递给开发人员, 方便处理
 - 重写这些事件方法, 就可以监听相关的信息
 
3.6.3 案例1
创建一个窗口包含一个标签
 要求:
- 鼠标进入标签时, 展示"欢迎光临"
 - 鼠标离开标签时, 展示"谢谢惠顾"
 
from PyQt5.Qt import *
import sys
class QWindow(QWidget):
    """window窗口类"""
    def __init__(self):
        super().__init__()
    def enterEvent(self, a0):
        label = self.findChild(QLabel)
        label.setText('欢迎光临')
    def leaveEvent(self, a0):
        label = self.findChild(QLabel)
        label.setText('请慢走')
class MyLabel(QLabel):
    """label控件类"""
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet('background-color: cyan;')
        self.move(350, 480)
        self.setText('Hello,你好')
        self.setFixedSize(120, 20)
        font = QFont("Hei", 10)
        font.setBold(True)
        self.setFont(font)
        self.setAlignment(Qt.AlignCenter)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QWindow()
    window.setWindowTitle('事件消息')
    window.resize(500, 500)
    # 创建一个标签
    label = MyLabel(window)
    window.show()
    sys.exit(app.exec_())
 
运行结果:
 
3.6.4 案例2
创建一个窗口, 监听用户按键
 要求:
- 监听用户输入Tab键
 - 监听用户输入Ctrl+S组合键
 - 监听用户输入Ctrl+Shift+A
 
补充:修饰键,多个修饰键使用或运算
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
补充:普通键:Qt.Key_xxx
from PyQt5.Qt import *
import sys
class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.label = MyLabel(self)
    def keyPressEvent(self, a0):
        """键盘输入监听方法"""
        if a0.key() == Qt.Key_Tab:
            self.label.setText('用户点击了Tab键')
        if a0.modifiers() == Qt.ControlModifier and a0.key() == Qt.Key_S:
            self.label.setText('用户点击了Ctrl+S键')
        if a0.modifiers() == Qt.ControlModifier | Qt.ShiftModifier and Qt.Key_A:
            self.label.setText('用户点击了Ctrl+Shift+A键')
class MyLabel(QLabel):
    """label控件类"""
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet('background-color: cyan;')
        self.move(0, 480)
        self.setText('Hello,你好')
        self.setFixedSize(500, 20)
        font = QFont("Hei", 10)
        font.setBold(True)
        self.setFont(font)
        self.setAlignment(Qt.AlignCenter)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle('事件消息')
    window.resize(500, 500)
    window.show()
    sys.exit(app.exec_())
 
运行结果:
 
3.6.5 案例3
完成窗口, 用户区支持拖拽
 要求:
- 鼠标点击了用户区拖拽也可以移动窗口
 
from PyQt5.Qt import *
import sys
class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.origin_y = None
        self.origin_x = None
        self.mouse_y = None
        self.mouse_x = None
        self.move_flag = False
        self.label = MyLabel(self)
    def mousePressEvent(self, a0):
        """鼠标按下方法"""
        if a0.button() == Qt.LeftButton:
            self.move_flag = True
            # 确定两个点:鼠标第一次按下的点,窗口当前所在的原始点
            self.mouse_x = a0.globalX()
            self.mouse_y = a0.globalY()
            self.origin_x = self.x()
            self.origin_y = self.y()
    def mouseMoveEvent(self, a0):
        """鼠标移动方法"""
        if self.move_flag:
            move_x = a0.globalX() - self.mouse_x
            move_y = a0.globalY() - self.mouse_y
            dest_x = self.origin_x + move_x
            dest_y = self.origin_y + move_y
            self.move(dest_x, dest_y)
    def mouseReleaseEvent(self, a0):
        if self.move_flag:
            self.move_flag = False
class MyLabel(QLabel):
    """label控件类"""
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet('background-color: cyan;')
        self.move(0, 480)
        self.setText('Hello,你好')
        self.setFixedSize(500, 20)
        font = QFont("Hei", 10)
        font.setBold(True)
        self.setFont(font)
        self.setAlignment(Qt.AlignCenter)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle('事件消息')
    window.resize(500, 500)
    window.show()
    sys.exit(app.exec_())
 
3.7 父子关系
3.7.1 API
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.7.2 应用场景
看着用吧
3.7.3 案例
创建窗口, 包含若干label控件
 要求:
- 点击哪个标签,就让哪个标签变红
 - 使用父控件处理,不可以使用自定义Label控件呦
 
from PyQt5.Qt import *
import sys
# class MyWidget(QLabel):
#     def mousePressEvent(self, event):
#         self.setStyleSheet("background-color: cyan;")
class Window(QWidget):
    def mousePressEvent(self, event):
        local_x = event.pos().x()
        local_y = event.pos().y()
        sub_widget = self.childAt(local_x, local_y)
        if sub_widget:
            sub_widget.setStyleSheet("background-color: cyan;")
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.setWindowTitle('事件消息')
    window.resize(600, 600)
    for i in range(1, 11):
        label = QLabel(window)
        label.setText('标签'+str(i))
        label.move(50*i, 50*i)
    window.show()
    sys.exit(app.exec_())
 
运行结果:
 
3.8 层级控制
3.8.1 API
注意: 以下操作专指同级控件| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.8.2 应用场景
需要调整控件Z轴顺序
3.9 顶层窗口相关
3.9.1 API
3.9.1.1 图标
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.9.1.2 标题
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.9.1.3 不透明度
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.9.1.4 窗口状态
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     Qt.WindowMinimized-最小化 Qt.WindowMaximized-最大化 Qt.WindowFullScreen-全屏 Qt.WindowActive-活动窗口  | ||||||
|  
     |  
     |  
     | ||||||
3.9.1.5 最大化最小化
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.9.1.6 窗口标志
3.9.1.6.1 window.setWindowFlags(参数)
参数介绍:
- 窗口样式
 
| 参数 | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
- 顶层窗口外观标志
 
| 参数 | 功能 | |||
|---|---|---|---|---|
|  
     |  
     | |||
|  
     |  
     | |||
|  
     |  
     | |||
|  
     |  
     | |||
|  
     |  
     | |||
|  
     |  
     | |||
|  
     |  
     | |||
|  
     |  
     | |||
|  
     |  
     | |||
|  
     |  
     | |||
|  
     |  
     | |||
|  
     |  
     | |||
3.9.1.6.2 windowFlags()
获取窗口标志
3.9.2 应用场景
调整整个应用程序窗口外观
3.9.3 案例
创建窗口
 要求:
- 无边框无标题栏
 - 窗口半透明
 - 自定义最小化, 最大化, 关闭按钮
 - 支持拖拽用户区移动
 
from PyQt5.Qt import *
import sys
class Window(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.move_flag = False
        self.min_btn = None
        self.max_btn = None
        self.close_btn = None
        # 公共数据
        self.top_margin = 10
        self.btn_w = 80
        self.btn_h = 40
        # 去掉边框以及标题栏
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.resize(500, 500)
        self.setWindowTitle('窗口案例')
        # 变成半透明
        self.setWindowOpacity(0.9)
        self.initUI()
    def initUI(self):
        """控件操作方法"""
        # 添加三个子控件 - 窗口右上角
        self.close_btn = QPushButton(self)
        self.close_btn.setText('关闭')
        self.close_btn.resize(self.btn_w, self.btn_h)
        self.max_btn = QPushButton(self)
        self.max_btn.setText('最大化')
        self.max_btn.resize(self.btn_w, self.btn_h)
        self.min_btn = QPushButton(self)
        self.min_btn.setText('最小化')
        self.min_btn.resize(self.btn_w, self.btn_h)
        self.close_btn.pressed.connect(self.close)
        def normal():
            if self.isMaximized():
                self.showNormal()
                self.max_btn.setText('最大化')
            else:
                self.showMaximized()
                self.max_btn.setText('恢复')
        self.max_btn.pressed.connect(normal)
        self.min_btn.pressed.connect(self.showMinimized)
        
    def resizeEvent(self, a0):
        """窗口适应方法"""
        window_w = self.width()
        close_btn_x = window_w - self.btn_w
        self.close_btn.move(close_btn_x, self.top_margin)
        
        max_btn_x = close_btn_x - self.btn_w
        self.max_btn.move(max_btn_x, self.top_margin)
        
        min_btn_x = max_btn_x - self.btn_w
        self.min_btn.move(min_btn_x, self.top_margin)
    def mousePressEvent(self, a0):
        """鼠标按下方法"""
        if a0.button() == Qt.LeftButton:
            self.move_flag = True
            # 确定两个点:鼠标第一次按下的点,窗口当前所在的原始点
            self.mouse_x = a0.globalX()
            self.mouse_y = a0.globalY()
            self.origin_x = self.x()
            self.origin_y = self.y()
    def mouseMoveEvent(self, a0):
        """鼠标移动方法"""
        if self.move_flag:
            move_x = a0.globalX() - self.mouse_x
            move_y = a0.globalY() - self.mouse_y
            dest_x = self.origin_x + move_x
            dest_y = self.origin_y + move_y
            self.move(dest_x, dest_y)
    def mouseReleaseEvent(self, a0):
        if self.move_flag:
            self.move_flag = False
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 去掉边框以及标题栏
    window = Window()
    # window = QWidget(flags=Qt.FramelessWindowHint)
    window.show()
    sys.exit(app.exec_())
 
运行结果:
 
3.10 控件交互
3.10.1 API
3.10.1.1 是否可用
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.10.1.2 是否显示/隐藏
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     马甲:setHidden(bool), show()展示控件;hide()隐藏控件  | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.10.1.3 是否编辑
设置窗口标题:xxx[*]
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     没有被编辑:不显示*  | ||||||
|  
     |  
     |  
     | ||||||
3.10.1.4 关闭
close()
 补充:setAttribute(Qt.WA_DeleteOnClose, True) :窗口在被关闭时(例如用户点击关闭按钮或调用 close() 方法时),会自动销毁并释放其占用的内存。
3.10.1.5 注意
visible: 代表最终控件状态,是否被我们可见(被其他控件遮挡也属于可见)
 hide: 可理解为相对父控件可见
 隐藏不一定是可见的,反之不然
3.10.2 应用场景
合适的时候,设置不用的状态,来控制交互逻辑
3.10.3 案例
创建一个窗口,包含一个文本框,一个按钮,一个标签
 要求:
- 默认情况下:①标签隐藏;②文本框按钮显示;③按钮设置为不可用状态
 - 当文本框有内容时,让按钮可用,否则为不可用
 - 当文本框内容为xujie时,点击按钮则显示标签,并展示文本为登录成功,否则为登录失败
 - 支持拖拽用户区移动
 
from PyQt5.Qt import *
import sys
class Window(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.resize(600, 600)
        # 设置窗口图标
        icon = QIcon('cats1.ico')
        self.setWindowIcon(icon)
        # 设置标题
        self.setWindowTitle('控件交互')
        self.initUI()
    def initUI(self):
        # 添加控件
        label = QLabel(self)
        label.setText('标签')
        label.move(100, 50)
        label.hide()
        l_edit = QLineEdit(self)
        l_edit.move(100, 100)
        btn = QPushButton(self)
        btn.setText('登录')
        btn.move(100, 150)
        btn.setEnabled(False)
        def text_cao(text):
            print('文本内容发生改变', text)
            if len(text) > 0:
                btn.setEnabled(True)
            else:
                btn.setEnabled(False)
        def check():
            print('按钮被点击了')
            content = l_edit.text()
            if content == 'xujie':
                label.show()
                label.setText('登录成功')
                label.adjustSize()
            else:
                label.show()
                label.setText('登录失败')
                label.adjustSize()
        l_edit.textChanged.connect(text_cao)
        btn.pressed.connect(check)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
 
3.11 信息提示
3.11.1 API
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.12 焦点控制
3.12.1 API
3.12.1.1 单个控件角度
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     ②Qt.ClickFocus: 通过单击获得焦点; ③Qt.StrongFocus: 通过两种方式获得焦点; ④Qt.NoFocus: 不通过上面方式获得焦点;  | ||||||
|  
     |  
     |  
     | ||||||
3.12.1.2 父控件角度
| API | 功能 | 备注 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     False:下一个  |  
     | ||||||
|  
     |  
     |  
     | ||||||
3.12.2 应用场景
结合程序的业务逻辑,来调整焦点操作
3.13 其他操作(不重要)
3.12.1.2 父控件角度
| 列表 | API | 解释 | ||||||
|---|---|---|---|---|---|---|---|---|
|  
     |  
     |  
     | ||||||
|  
     |  
     |  
     另请参阅setMask(),clearMask(),QRegion :: isEmpty()和形状时钟示例。  | ||||||
|  
     |  
     |  
     | ||||||
|  
     |  
     ②repaint()  |  
     | ||||||
|  
     |  
     ②removeAction(),insertAction(),actions()  |  
     | ||||||
|  
     |  
     ②mouseGrabber() ③grabMouse() ④nextInFocusChain() ⑤previousInFocusChain() ⑥releaseKeyboard()  |  
     | ||||||
|  
     |  
     ②setShortcutEnabled(int id,bool enable = true) ③grabShortcut() ④releaseShortcut()  |  
     | ||||||
|  
     |  
     ② mapFromGlobal(const QPoint& pos)const ③将全局屏幕坐标pos转换为小部件坐标。 ④又见mapToGlobal(),mapFrom(),和mapFromParent()。 ⑤: mapTo(const QWidget * parent,const QPoint& pos)const ⑥将小部件坐标pos转换为父项的坐标系。在父母不能为0,且必须调用控件的父。 ⑦又见mapFrom(),mapToParent(),mapToGlobal(),和underMouse()。 ⑧QPoint QWidget :: mapToGlobal(const QPoint& pos)const  |  
     | ||||||



















