生活与工具
#ai
pyqt
PyQt/PySide6 overview hub - installation, comparison, project structure. See sub-skills for detailed topics.
DeepseekModel
官方收录技能
质量 优秀 · 78
v1.0.0
获取
https://deepseekmodel.com/api/download.php?id=mte90-dotfiles-config-opencode-skills-pyqt-skill-md&format=skill
下载 .skill
标准格式,含 system_prompt 与 model_config,导入任意 Agent 框架即可使用
.skill 文件中 system_prompt 字段的实际内容。
name pyqt description PyQt/PySide6 overview hub - installation, comparison, project structure. See sub-skills for detailed topics. metadata {"author":"mte90","version":"2.0.0","tags":["python","qt","pyqt","pyside","gui","desktop","hub"]} PyQt/PySide Development PyQt and PySide are Python bindings for the Qt application framework for building cross-platform desktop applications. Sub-Skills For detailed information, see the specialized sub-skills: Skill Description Path pyqt-core Signals, slots, timers, settings, file I/O core/SKILL.md pyqt-widgets All widgets and layouts widgets/SKILL.md pyqt-threading QThread, thread pools, concurrency threading/SKILL.md pyqt-dialogs Standard and custom dialogs dialogs/SKILL.md pyqt-testing pytest-qt testing patterns testing/SKILL.md pyqt-styling QSS styling and themes styling/SKILL.md pyqt-multimedia Audio, video, camera, recording multimedia/SKILL.md PyQt vs PySide Comparison Feature PyQt5 PyQt6 PySide6 License GPL GPL LGPL Qt Version Qt 5 Qt 6 Qt 6 Maintained Security only Active Active Signal Syntax pyqtSignal pyqtSignal Signal Slot Syntax pyqtSlot pyqtSlot Slot Property Syntax pyqtProperty pyqtProperty Property Commercial Use Requires license Requires license Free QML Registration qmlRegisterType() qmlRegisterType() @QmlElement When to Use Each PySide6 : Recommended for most projects (LGPL, official Qt Company support) PyQt6 : If you need GPL compatibility or existing PyQt codebase PyQt5 : Legacy projects only (security fixes only) Installation PySide6 (Recommended) pip install PySide6 PyQt6 pip install PyQt6 PyQt5 (Legacy) pip install PyQt5 Additional Dependencies # System packages (Ubuntu/Debian) sudo apt install libgl1-mesa-glx libglib2.0-0 # System packages (Fedora) sudo dnf install mesa-libGL glib2 # System packages (Arch) sudo pacman -S mesa glib2 Basic Application #!/usr/bin/env python3 import sys from PySide6.QtWidgets import QApplication, QMainWindow, QLabel from PySide6.QtCore import Qt class MainWindow ( QMainWindow ): def __init__ ( self ): super ().__init__() self .setWindowTitle( "My Application" ) self .setGeometry( 100 , 100 , 800 , 600 ) label = QLabel( "Hello, Qt!" ) label.setAlignment(Qt.AlignmentFlag.AlignCenter) self .setCentralWidget(label) def main (): app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app. exec ()) if __name__ == "__main__" : main() Recommended Project Structure my_app/ ├── src/ │ ├── __init__.py │ ├── main.py │ ├── main_window.py │ ├── widgets/ │ │ ├── __init__.py │ │ └── custom_widget.py │ ├── models/ │ │ └── data_model.py │ ├── resources/ │ │ ├── icons/ │ │ └── styles/ │ │ └── style.qss │ └── utils/ │ └── helpers.py ├── tests/ │ └── test_main.py ├── requirements.txt └── pyproject.toml Quick Reference Core Imports # QtWidgets - UI Components from PySide6.QtWidgets import ( QApplication, QMainWindow, QWidget, QLabel, QPushButton, QLineEdit, QTextEdit, QComboBox, QSpinBox, QCheckBox, QRadioButton, QSlider, QProgressBar, QGroupBox, QTabWidget, QStackedWidget, QSplitter, QListWidget, QTreeWidget, QTableWidget, QScrollArea, QToolBar, QStatusBar, QMenuBar, QMenu ) # QtCore - Core Non-GUI from PySide6.QtCore import ( Qt, QObject, QTimer, QThread, Signal, Slot, Property, QSize, QPoint, QRect, QSettings, QFile, QDir, QUrl, QMimeData, QDateTime, QDate, QTime ) # QtGui - Graphics from PySide6.QtGui import ( QIcon, QPixmap, QImage, QPainter, QPen, QBrush, QColor, QFont, QCursor, QKeySequence, QShortcut ) Signal/Slot Basics from PySide6.QtCore import QObject, Signal, Slot class MyObject ( QObject ): valueChanged = Signal( int ) @Slot( int ) def setValue ( self, value ): self ._value = value self .valueChanged.emit(value) # Connect button.clicked.connect( self .onButtonClick) # Emit self .valueChanged.emit( 42 ) Layout Basics from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QGridLayout, QFormLayout # Vertical layout = QVBoxLayout() layout.addWidget(label) layout.addWidget(button) # Horizontal h_layout = QHBoxLayout() h_layout.addWidget(left) h_layout.addWidget(right) # Grid grid = QGridLayout() grid.addWidget(label, 0 , 0 ) grid.addWidget( input , 0 , 1 ) # Form form = QFormLayout() form.addRow( "Name:" , nameEdit) Signals and Slots Signal Declaration from PySide6.QtCore import QObject, Signal class MyObject ( QObject ): # Define signals at class level valueChanged = Signal( int ) nameChanged = Signal( str ) dataReady = Signal( dict ) errorOccurred = Signal( str ) # Signal with multiple arguments positionChanged = Signal( int , int ) Slot Declaration from PySide6.QtCore import Slot class MyObject ( QObject ): @Slot() def doSomething ( self ): print ( "Action performed" ) @Slot( int ) def setValue ( self, value ): self ._value = value @Slot( str , int ) def processData ( self, name, count ): pass @Slot( result= str ) # Return type annotation def getName ( self ) -> str : return self ._name Connecting Signals to Slots # Connect signal to slot button.clicked.connect( self .onButtonClick) valueChanged.connect( self .updateValue) # Connect with lambda button.clicked.connect( lambda : print ( "Clicked!" )) # Connect with partial from functools import partial button.clicked.connect(partial( self .processItem, item_id)) # Disconnect button.clicked.disconnect( self .onButtonClick) # Emit signal self .valueChanged.emit( 42 ) self .positionChanged.emit(x, y) # Block signals temporarily button.blockSignals( True ) button.setChecked( True ) button.blockSignals( False ) PyQt6 Syntax (Different) from PyQt6.QtCore import QObject, pyqtSignal, pyqtSlot class MyObject ( QObject ): valueChanged = pyqtSignal( int ) @pyqtSlot( int ) def setValue ( self, value ): pass Layout Management Box Layouts from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QGroupBox # Vertical layout layout = QVBoxLayout() layout.addWidget(label) layout.addWidget(button) layout.addStretch() # Add stretchable space layout.addWidget(bottom_label) # Horizontal layout h_layout = QHBoxLayout() h_layout.addWidget(left_button) h_layout.addStretch() h_layout.addWidget(right_button) # Nest layouts main_layout = QVBoxLayout() main_layout.addLayout(h_layout) Grid Layout from PySide6.QtWidgets import QGridLayout layout = QGridLayout() layout.addWidget(label1, 0 , 0 ) # row 0, col 0 layout.addWidget(lineEdit, 0 , 1 ) # row 0, col 1 layout.addWidget(label2, 1 , 0 ) # row 1, col 0 layout.addWidget(comboBox, 1 , 1 ) # row 1, col 1 # Span multiple cells layout.addWidget(bigWidget, 2 , 0 , 1 , 2 ) # row 2, col 0, span 1 row, 2 cols Form Layout from PySide6.QtWidgets import QFormLayout layout = QFormLayout() layout.addRow( "Name:" , nameLineEdit) layout.addRow( "Email:" , emailLineEdit) layout.addRow( "Age:" , ageSpinBox) Stack Layout from PySide6.QtWidgets import QStackedLayout stack = QStackedLayout() stack.addWidget(page1) stack.addWidget(page2) stack.addWidget(page3) stack.setCurrentIndex( 0 ) # Show page1 Layout Properties # Margins and spacing layout.setContentsMargins( 10 , 10 , 10 , 10 ) # left, top, right, bottom layout.setSpacing( 5 ) # Widget alignment layout.addWidget(label, alignment=Qt.AlignCenter) # Stretch factors layout.addWidget(widget1, stretch= 1 ) layout.addWidget(widget2, stretch= 2 ) # Gets twice the space Common Widgets Labels and Display # Label label = QLabel( "Text" ) label.setText( "New text" ) label.setPixmap(QPixmap( "image.png" )) label.setAlignment(Qt.AlignCenter) label.setWordWrap( True ) # Progress bar progress = QProgressBar() progress.setValue( 50 ) progress.setRange( 0 , 100 ) progress.setTextVisible( True ) # LCD Number lcd = QLCDNumber() lcd.display( 123 ) Input Widgets # Line edit lineEdit = QLineEdit() lineEdit.setText( "Default" ) lineEdit.setPlaceholderText( "Enter text..." ) lineEdit.setEchoMode(QLineEdit.Password) lineEdit.setMaxLength( 100 ) lineEdit.textChanged.connect( self .onTextChanged) # Text edit textEdit = QTextEdit() textEdit.setPlainText( "Plain text" ) textEdit.setHtml( "<b>HTML</b>" ) textEdit.toPlainText() # Spin box spinBox = QSpinBox() spinBox.setRange( 0 , 100 ) spinBox.setValue( 50 ) spinBox.setSuffix( " px" ) spinBox.valueChanged.connect( self .onValueChanged) # Combo box comboBox = QComboBox() comboBox.addItems([ "Option 1" , "Option 2" , "Option 3" ]) comboBox.setCurrentIndex( 0 ) comboBox.currentTextChanged.connect( self .onSelectionChanged) # Checkbox checkBox = QCheckBox( "Enable feature" ) checkBox.setChecked( True ) checkBox.stateChanged.connect( self .onStateChanged) # Radio button radio1 = QRadioButton( "Option A" ) radio2 = QRadioButton( "Option B" ) radio1.setChecked( True ) radio1.toggled.connect( self .onToggled) # Slider slider = QSlider(Qt.Horizontal) slider.setRange( 0 , 100 ) slider.setValue( 50 ) slider.valueChanged.connect( self .onSliderChanged) Buttons # Push button button = QPushButton( "Click Me" ) button.clicked.connect( self .onButtonClick) button.setEnabled( False ) button.setDefault( True ) # Tool button toolButton = QToolButton() toolButton.setIcon(QIcon( "icon.png" )) toolButton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) # Checkable button checkButton = QPushButton( "Toggle" ) checkButton.setCheckable( True ) checkButton.toggled.connect( self .onToggle) Container Widgets # Group box groupBox = QGroupBox( "Settings" ) groupBox.setCheckable( True ) groupBox.setChecked( True ) # Tab widget tabWidget = QTabWidget() tabWidget.addTab(page1, "Tab 1" ) tabWidget.addTab(page2, "Tab 2" ) tabWidget.setCurrentIndex( 0 ) # Scroll area scrollArea = QScrollArea() scrollArea.setWidget(contentWidget) scrollArea.setWidgetResizable( True ) # Splitter splitter = QSplitter(Qt.Horizontal) splitter.addWidget(leftWidget) splitter.addWidget(rightWidget) splitter.setSizes([ 200 , 400 ]) Item Views # List widget listWidget = QListWidget() listWidget.addItems([ "Item 1" , "Item 2" , "Item 3" ]) listWidget.currentItemChanged.connect( self .onItemChanged) # Tree widget treeWidget = QTreeWidget() treeWidget.setHeaderLabels([ "Name" , "Value" ]) item = QTreeWidgetItem([ "Parent" , "0" ]) child = QTreeWidgetItem([ "Child" , "1" ]) item.addChild(child) treeWidget.addTopLevelItem(item) # Table widget table = QTableWidget() table.setRowCount( 3 )
Agent 识别该技能的关键词,点击任意一个即可复制。
该技能未提供触发词。
下载的 .skill 包内含以下字段。
| 字段 | 说明 |
|---|---|
| format | 格式标识(skill/v1) |
| skill_id | 技能唯一 ID |
| name | 技能名称 |
| version | 版本号 |
| description | 技能描述 |
| category | 所属分类(数组) |
| trigger_words | 触发词列表 |
| tags | 标签列表 |
| source | 来源标识 |
| source_url | 来源链接(本页地址) |
| exported_at | 导出时间(每次下载生成) |
| system_prompt | 系统提示词正文 |
| model_config | 模型参数:provider / model / temperature / max_tokens / top_p |
| examples | 示例 |
| install_guide | 各平台导入说明(Coze / Dify / Claude / 自定义框架) |