QWidget详细解说

QWidgetPython(PyQt/PySide) 中的详细解说,涵盖核心方法、属性、使用场景及代码示例:


1. QWidget 基础

QWidget 是 Qt 中所有用户界面控件的基类,用于构建 GUI 应用。在 Python 中,主要通过 PyQt5PySide6 库使用。

from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QVBoxLayout
# 或 from PySide6.QtWidgets import ...

2. 核心方法与属性

几何属性与布局

方法/属性 说明 Python 示例
geometry() 获取控件的位置和尺寸(相对于父窗口) rect = widget.geometry()
setGeometry(x, y, w, h) 设置控件的位置和尺寸 widget.setGeometry(100, 100, 300, 200)
size() 获取控件的尺寸 width, height = widget.size().width(), widget.size().height()
resize(w, h) 调整控件尺寸 widget.resize(400, 300)
move(x, y) 移动控件到父窗口的坐标 widget.move(50, 50)
adjustSize() 根据内容自动调整尺寸 widget.adjustSize()

窗口与可见性

方法/属性 说明 Python 示例
show() 显示控件(顶级窗口直接弹出) widget.show()
hide() 隐藏控件 widget.hide()
isVisible() 检查控件是否可见 if widget.isVisible(): ...
setWindowTitle(title) 设置窗口标题 widget.setWindowTitle("My App")
setWindowFlag(flag) 设置窗口标志(如无边框) widget.setWindowFlag(Qt.FramelessWindowHint)

事件处理

方法 说明 Python 示例
paintEvent() 重写绘制事件 见下方代码示例
mousePressEvent() 处理鼠标点击事件 见下方代码示例
keyPressEvent() 处理键盘事件 def keyPressEvent(self, event): ...

焦点与样式

方法/属性 说明 Python 示例
setFocus() 让控件获取焦点 widget.setFocus()
setStyleSheet(style) 设置 CSS 样式表 widget.setStyleSheet("background: #f0f0f0;")
setEnabled(enable) 启用/禁用控件 widget.setEnabled(False)

3. 代码示例

基础窗口

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(100, 100, 400, 300)  # (x, y, width, height)
        self.setWindowTitle("Hello PyQt")
        label = QLabel("Welcome to Qt!", self)
        label.move(50, 50)
        self.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec_())

自定义控件(重写 paintEvent

from PyQt5.QtGui import QPainter, QColor
from PyQt5.QtCore import Qt

class CircleWidget(QWidget):
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setBrush(QColor("#FF5733"))
        painter.drawEllipse(self.rect())  # 在控件区域内绘制圆形

# 使用
widget = CircleWidget()
widget.resize(200, 200)
widget.show()

事件处理(鼠标点击)

class ClickableWidget(QWidget):
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            print(f"Clicked at ({event.x()}, {event.y()})")
        super().mousePressEvent(event)  # 调用父类方法

widget = ClickableWidget()
widget.setMouseTracking(True)  # 启用鼠标跟踪

布局管理

class LayoutExample(QWidget):
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout()
        layout.addWidget(QPushButton("Button 1"))
        layout.addWidget(QPushButton("Button 2"))
        self.setLayout(layout)
        self.show()

4. 关键属性

属性 类型 说明
windowTitle str 窗口标题(通过 setWindowTitle 设置)
enabled bool 控件是否启用(setEnabled(True/False)
toolTip str 鼠标悬停提示文本(setToolTip("text")
sizePolicy QSizePolicy 控件在布局中的缩放策略(如 setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)

5. 高级用法

动态样式表

widget.setStyleSheet("""
    QWidget {
        background: #2c3e50;
        color: white;
        border-radius: 10px;
    }
    QPushButton {
        background: #3498db;
        padding: 5px 10px;
    }
""")

信号与槽

button = QPushButton("Click Me", widget)
button.clicked.connect(self.on_button_clicked)  # 绑定点击事件

def on_button_clicked(self):
    print("Button clicked!")

窗口标志与属性

# 设置无边框和透明背景
self.setWindowFlag(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)

6. 注意事项

  1. 内存管理
    Python 的垃圾回收会自动处理控件,但建议通过父子关系管理对象:

    button = QPushButton("OK", parent_widget)  # 父控件销毁时自动删除子控件
    
  2. 线程安全
    GUI 操作必须在主线程执行,否则会崩溃。耗时任务需使用 QThreadQTimer

  3. 事件循环
    避免在事件处理函数中执行阻塞操作(如 time.sleep),改用异步或定时器。


总结

QWidget 是 Qt GUI 开发的核心,通过 Python 的 PyQt/PySide 可以快速构建跨平台应用。重点掌握:

  • 几何属性与布局管理
  • 事件处理机制(重写 paintEventmousePressEvent 等)
  • 样式表与信号槽机制
  • Python 特有的父子对象内存管理
posted @ 2025-04-30 07:47  天堂面包  阅读(290)  评论(0)    收藏  举报