{
    "format": "skillpro/v1",
    "skill_id": "mte90-dotfiles-config-opencode-skills-pyqt-skill-md",
    "name": "pyqt",
    "version": "1.0.0",
    "description": "PyQt/PySide6 overview hub - installation, comparison, project structure. See sub-skills for detailed topics.",
    "category": [
        "职场效率"
    ],
    "trigger_words": [],
    "tags": [
        "ai"
    ],
    "source": "DeepseekModel",
    "source_url": "https://deepseekmodel.com/skill?id=mte90-dotfiles-config-opencode-skills-pyqt-skill-md",
    "exported_at": "2026-09-18T00:18:34+08:00",
    "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 )",
    "model_config": {
        "provider": "deepseek",
        "model": "deepseek-chat",
        "temperature": 0.7,
        "max_tokens": 4096,
        "top_p": 0.9
    },
    "examples": [
        {
            "input": "请用pyqt帮我处理问题",
            "output": "好的，我是pyqt。PyQt/PySide6 overview hub - installation, comparison, project structure. See sub-skills for detailed topics. 我会根据你的需求提供专业帮助。"
        },
        {
            "input": "介绍一下你的能力",
            "output": "我是pyqt，专注于职场效率领域。PyQt/PySide6 overview hub - installation, comparison, project structure. See sub-skills for detailed topics."
        }
    ],
    "install_guide": {
        "coze": "在 Coze 平台创建 Bot -> 技能配置 -> 导入此 .skill 文件",
        "dify": "在 Dify 平台创建应用 -> 添加知识库 -> 导入此 .skill 配置",
        "claude": "将 system_prompt 字段内容复制到 Claude 自定义指令中",
        "custom": "将此 .skill 文件加载到你的 AI Agent 框架中，解析 system_prompt 和 model_config 即可使用"
    },
    "scripts": {
        "python": "# pyqt - Python extension\n# Add custom Python logic here\ndef process(input_data):\n    return input_data\n",
        "javascript": "// pyqt - JavaScript extension\n// Add custom JS logic here\nfunction process(inputData) {\n    return inputData;\n}\n"
    },
    "tools": {
        "mcp_servers": [],
        "api_endpoints": []
    },
    "dependencies": {
        "python": [],
        "node": []
    },
    "hooks": {
        "on_load": "echo \"Skill loaded: pyqt\"",
        "on_call": "",
        "on_error": "echo \"Skill error: please check logs\""
    }
}