# Create GUI Application with Python Qt6 ## Basic - qt - `QApplication` - 维护了一个`event loop` - `QWidget` - 可以使用`layouts`任意组合形成复杂ui - `QMainWindow` - 预设的组件,提供了一些特性 - toolbar, menu, status bar, dockable widget.. - 练习1 - signal/slots - 很多组件都有`public slots`, 可以直接和其他信号连接 - 数据类型要对的上? - 组件 - 对齐 - `Qt.AlignmentFlag.Align*` - `QLabel` - 显式图片 - `.setPixmap(QPixmap("xxx.jpg"))` - `QCheckBox` - 信号 - `.stateChanged.connect(..)` - `QComboBox` - `.addItems([])` - 信号 - `.currentIndexChanged.connect(..) - `.currentTextChanged.connect(..)` - `QListWidget` - `.addItems([])` - 信号 - `.currentItemChanged.connect(..)` - `def item_changed(item)` - `.currentTextChanged.connect(..)` - `def text_changed(string)` - `QLineEdit` - `.setInputMask('000.0000.000.000;'` - 布局 - `QHBoxLayout` - `QVBoxLayout` - `QGridLayout` - `QStackedLayout` - Actions/Toolbars/Menus - toolbar - 元素 - 图标/文本/任意Qt widget ## 练习 ### 1 概念熟悉 ```python import sys from PySide6.QtCore import QSize, Qt from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("ex-1") btn = QPushButton("Press Me!") self.setCentralWidget(btn) self.setFixedSize(QSize(400, 400)) app = QApplication(sys.argv) win = MainWindow() win.show() sys.exit(app.exec()) ``` ![[Pasted image 20220406013205.png]] ### 2. 布局/signal初试 ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("ex-2") self.label = QLabel() self.input = QLineEdit() self.input.textChanged.connect(self.label.setText) vbox = QVBoxLayout() vbox.addWidget(self.input) vbox.addWidget(self.label) container = QWidget() container.setLayout(vbox) self.setCentralWidget(container) ``` ![[Pasted image 20220406014236.png]] ### 3. 布局 ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() # 纵向布局 vl = QVBoxLayout() vl.addWidget(Color("red")) vl.addWidget(Color("green")) vl.addWidget(Color("blue")) # 横向布局 hl = QHBoxLayout() hl.addWidget(Color("red")) hl.addWidget(Color("green")) hl.addWidget(Color("blue")) # 嵌套布局 l1 = QHBoxLayout() l2 = QVBoxLayout() l3 = QVBoxLayout() l2.addWidget(Color("red")) l2.addWidget(Color("yellow")) l2.addWidget(Color("purple")) l1.addLayout(l2) l1.addWidget(Color("green")) l3.addWidget(Color("red")) l3.addWidget(Color("purple")) l1.addLayout(l3) l1.setContentsMargins(0,0,0,0) l1.setSpacing(20) # 表格布局 gl = QGridLayout() gl.addWidget(Color("red"), 0, 0) gl.addWidget(Color("green"), 1, 0) gl.addWidget(Color("blue"), 1, 1) gl.addWidget(Color("purple"), 2, 1) # 堆栈布局 sl = QStackedLayout() sl.addWidget(Color("red")) sl.addWidget(Color("green")) sl.addWidget(Color("blue")) sl.addWidget(Color("purple")) pl = QVBoxLayout() bl = QHBoxLayout() self.stack_layout = QStackedLayout() pl.addLayout(bl) pl.addLayout(self.stack_layout) btn = QPushButton("red") btn.pressed.connect(self.active_tab1) bl.addWidget(btn) self.stack_layout.addWidget(Color("red")) btn = QPushButton("green") btn.pressed.connect(self.active_tab2) bl.addWidget(btn) self.stack_layout.addWidget(Color("green")) btn = QPushButton("blue") btn.pressed.connect(self.active_tab3) bl.addWidget(btn) self.stack_layout.addWidget(Color("blue")) # tab布局 tabs = QTabWidget() tabs.setTabPosition(QTabWidget.TabPosition.North) tabs.setMovable(True) for n, color in enumerate(["red", "green", "blue", "yellow"]): tabs.addTab(Color(color), color) w = QWidget() w.setLayout(pl) self.setCentralWidget(tabs) def active_tab1(self): self.stack_layout.setCurrentIndex(0) def active_tab2(self): self.stack_layout.setCurrentIndex(1) def active_tab3(self): self.stack_layout.setCurrentIndex(2) ```