PySide6 GUI 编程(2):窗口设置与基础控件
原创
自定义窗口
代码示例
from PySide6.QtCore import QSize
from PySide6.QtWidgets import QApplication, QMainWindow
class MyMainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('My App Window 我的自定义窗口')
self.setToolTip('My App Tip Info 这是我的自定义窗口的提示信息')
# 设置窗口的固定大小,长 400,宽 300
self.setFixedSize(QSize(400, 300))
if __name__ == '__main__':
app = QApplication([])
window = MyMainWindow()
window.show()
app.exec()
代码分析
自定义窗口类
上述代码中,
class MyMainWindow(QMainWindow):
定义了一个名为
MyMainWindow
的类,它继承自
QMainWindow
类。
QMainWindow
是Qt框架中用于创建和管理主窗口的一个类,这意味着
MyMainWindow
类将拥有
QMainWindow
的所有功能和属性。
def __init__(self):
super().__init__()
这行代码调用了父类
QMainWindow
的构造函数,确保了父类被正确初始化。
super()
函数用于访问父类的方法和属性。
设置窗口标题
设置窗口标题:
self.setWindowTitle('My App Window 我的自定义窗口')
,这个标题会显示在窗口的标题栏上。
设置窗口提示信息
设置窗口的工具提示信息:
self.setToolTip('My App Tip Info 这是我的自定义窗口的提示信息')
,当用户将鼠标悬停在窗口上时,这个提示信息会显示为一个小型弹出窗口。
设置窗口固定大小
设置窗口固定大小:
self.setFixedSize(QSize(400, 300))
,使用 setFixedSize 方法设置窗口的固定大小,参数 QSize(400, 300) 指定了窗口的宽度为400像素,高度为300像素。这会禁止用户调整窗口大小,窗口大小将被锁定为指定的尺寸。
最终运行效果
基础控件
QPushButton
写法一
from PySide6.QtWidgets import QApplication, QPushButton
app = QApplication([])
window = QPushButton("Push Me 这是一个按钮")
window.setToolTip('Tip Info 这是按钮的提示信息')
window.show()
app.exec()
写法二
class MyPushButton(QMainWindow):
def __init__(self):
super().__init__()
QPushButton('自定义 QPushButton', self).setToolTip('我的自定义 button 实例')
if __name__ == '__main__':
app = QApplication()
button = MyPushButton()
button.show()
app.exec()
QPushButton
构造函数中的
self
参数是必需的,原因如下:
-
父对象引用:
self是MyPushButton类的实例引用,将其传递给QPushButton意味着正在创建一个子控件(按钮),它属于MyPushButton窗口。 -
内存管理:在Qt中,当
父对象被销毁时,其所有子对象也会自动被销毁。通过将self作为父对象传递给QPushButton,确保了按钮会被正确地管理,并且当MyPushButton窗口被销毁时,按钮也会随之销毁。 -
事件处理:
子控件通常会将事件(如鼠标点击、键盘输入等)传递给它们的父对象。通过指定self作为父对象,按钮能够将事件传递给MyPushButton类的实例,允许在类中处理这些事件。 -
布局管理:在Qt中,控件的布局是基于
父子关系来管理的。指定 self 作为父对象可以确保按钮被正确地放置在窗口内,并且可以利用布局管理器来自动调整按钮的位置和大小。 -
绘图和焦点:
父对象负责绘制其子对象,并且焦点策略也依赖于父子关系来确定焦点顺序。 因此,在MyPushButton类中创建一个QPushButton实例并将其添加到窗口时,传递self作为父对象是至关重要的,它确保了按钮能够正常工作并集成到窗口中。 如果不传递父对象,QPushButton将无法正确地与窗口交互,也无法利用Qt框架提供的各种功能。
QLabel
写法一
from PySide6.QtWidgets import QApplication, QLabel
app = QApplication([])
label = QLabel('Label Text 这是一个标签')
label.setToolTip('Tip Info 这是标签的提示信息')
label.show()
app.exec()
写法二
from PySide6.QtWidgets import QApplication, QLabel, QMainWindow
class MyLabel(QMainWindow):
def __init__(self):
super().__init__()
QLabel('MyLabel', self).setToolTip('我的自定义 label 实例')
if __name__ == '__main__':
app = QApplication()
button = MyLabel()
button.show()
app.exec()
QLineEdit
写法一
from PySide6.QtWidgets import QApplication, QLineEdit
app = QApplication([])
window = QLineEdit()
window.setWindowTitle('LineEdit 输入框')
window.setPlaceholderText('请输入内容')
window.show()
app.exec()
写法二
from PySide6.QtWidgets import QApplication, QLineEdit, QMainWindow
class MyLineEdit(QMainWindow):
def __init__(self):
super().__init__()
ins = QLineEdit(self)
ins.setPlaceholderText('请输入内容')
if __name__ == '__main__':
app = QApplication()
line_edit = MyLineEdit()
line_edit.setWindowTitle('QLineEdit 输入框')
line_edit.show()
app.exec()
对于 QLineEdit 设置标题时需要注意的点
对于以下代码:
from PySide6.QtWidgets import QApplication, QLineEdit, QMainWindow
class MyLineEdit(QMainWindow):
def __init__(self):
super().__init__()
ins = QLineEdit(self)
ins.setPlaceholderText('请输入内容')
# 这里的标题不会生效!!!
ins.setWindowTitle('QLineEdit 输入框')