ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用 PySide6 编写Qt程序

使用 PySide6 编写Qt程序 我想装一个python qt试试我之前都是用c qt直接上 PySide6Qt 官方 Python 绑定优先选这个不要 PyQt6理由Qt 官方维护LGPL 协议宽松类名、API 和 CQt 几乎一模一样你有 CQt 基础上手几乎零成本PyQt6 是第三方商用要付费直接排除。最小 Demofrom PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget import sys # 主窗口类和C的class MainWindow : public QMainWindow 完全对应 class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(PySide6 测试窗口) self.resize(400,220) # 中心部件 布局 central_widget QWidget() self.setCentralWidget(central_widget) layout QVBoxLayout(central_widget) self.btn QPushButton(点击按钮) layout.addWidget(self.btn) # 信号槽C connect(btn,QPushButton::clicked,this,xxx); self.btn.clicked.connect(self.on_button_click) def on_button_click(self): self.btn.setText(按钮被点击了) if __name__ __main__: app QApplication(sys.argv) win MainWindow() win.show() sys.exit(app.exec())前置条件Windows 安装步骤推荐先建虚拟环境隔离包打开 Windows Terminal / PowerShell# 1. 创建虚拟环境文件夹叫env只装本次项目依赖 python -m venv pyside_env # 2. 激活虚拟环境Windows .\pyside_env\Scripts\activate激活成功后命令行前面会出现(pyside_env)# 3. 安装PySide6 pip install pyside6装好自带工具pyside6-designer直接启动 Qt Designer就是你熟悉的拖拽 UI 编辑器不用额外装 Qt Creator。验证安装python -c import PySide6;print(PySide6.__version__)为什么需要创建虚拟环境虚拟环境就是给每个 Python 项目单独 “隔离一套独立的Python 解释器 包”项目之间互不干扰。你写 C/C 习惯了我用你熟悉的开发场景类比。类比 C/C 项目C/C不同项目依赖不同版本的库一般靠单独的编译环境、CMake 工具链、vcpkg/conan 的独立包目录隔离如果所有项目共用一套全局库版本冲突就会编译报错。Python 默认不建虚拟环境所有项目共用同一个全局 pip 包目录。所有库全部装在一处。虚拟环境解决的核心问题解决包版本冲突最主要目的举个例子项目 APySide6 上位机需要pyside66.7.0项目 B老脚本需要pyside66.4.2如果装在全局后安装的版本会覆盖前面的版本其中一个项目直接报错。虚拟环境A 的环境装 6.7B 的环境装 6.4互相看不见完全隔离。你后面可能还会装rich、textual、numpy、scipy不同库对依赖版本要求不一样很容易踩坑。让ai生成了一个复杂点的程序from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QTableWidget, QTableWidgetItem, QLabel, QLineEdit, QHeaderView) from PySide6.QtCore import QTimer, Qt from PySide6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis from PySide6.QtGui import QPen, QPainter # 增加 QPainter import sys import random class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(PySide6 UDP报文监控上位机) self.resize(900, 600) # 采集状态标记 self.is_running False self.data_count 0 self.series QLineSeries() # 波形曲线 # 定时器模拟UDP接收报文100ms触发一次 self.timer QTimer() self.timer.timeout.connect(self.on_timer_recv) # 中心部件与总布局 central_widget QWidget() self.setCentralWidget(central_widget) main_layout QHBoxLayout(central_widget) # 左侧布局控制 报文表格 left_widget QWidget() left_layout QVBoxLayout(left_widget) left_widget.setFixedWidth(420) # 控制行IP、端口、按钮 ctrl_layout QHBoxLayout() ctrl_layout.addWidget(QLabel(目标IP:)) self.edit_ip QLineEdit(127.0.0.1) ctrl_layout.addWidget(self.edit_ip) ctrl_layout.addWidget(QLabel(端口:)) self.edit_port QLineEdit(8888) ctrl_layout.addWidget(self.edit_port) left_layout.addLayout(ctrl_layout) # 功能按钮行 btn_layout QHBoxLayout() self.btn_start QPushButton(开始采集) self.btn_start.clicked.connect(self.toggle_collect) self.btn_clear QPushButton(清空表格) self.btn_clear.clicked.connect(self.clear_table) btn_layout.addWidget(self.btn_start) btn_layout.addWidget(self.btn_clear) left_layout.addLayout(btn_layout) # 报文表格 self.table QTableWidget() self.table.setColumnCount(3) self.table.setHorizontalHeaderLabels([序号, 数值, 时间戳]) self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) left_layout.addWidget(self.table) # 右侧QChart波形图 self.chart QChart() self.chart.setTitle(实时信号波形) self.chart.addSeries(self.series) # 坐标轴 self.axis_x QValueAxis() self.axis_x.setTitleText(采样点) self.axis_x.setRange(0, 50) self.axis_y QValueAxis() self.axis_y.setTitleText(幅值) self.axis_y.setRange(0, 100) self.chart.addAxis(self.axis_x, Qt.AlignBottom) self.chart.addAxis(self.axis_y, Qt.AlignLeft) self.series.attachAxis(self.axis_x) self.series.attachAxis(self.axis_y) pen QPen(Qt.blue) pen.setWidth(2) self.series.setPen(pen) chart_view QChartView(self.chart) # 修复这一行 chart_view.setRenderHint(QPainter.RenderHint.Antialiasing) # 左右布局加入总布局 main_layout.addWidget(left_widget) main_layout.addWidget(chart_view) def toggle_collect(self): 启停采集 if not self.is_running: self.is_running True self.btn_start.setText(停止采集) self.timer.start(100) # 100ms周期 else: self.is_running False self.btn_start.setText(开始采集) self.timer.stop() def on_timer_recv(self): 定时器回调模拟收到UDP报文 self.data_count 1 # 模拟信号值 val random.randint(20,80) # 插入表格新行 row self.table.rowCount() self.table.insertRow(row) self.table.setItem(row, 0, QTableWidgetItem(str(self.data_count))) self.table.setItem(row, 1, QTableWidgetItem(str(val))) self.table.setItem(row, 2, QTableWidgetItem(f{self.data_count*0.1:.1f}s)) # 添加波形点只保留最近50个点 self.series.append(self.data_count, val) if self.series.count() 50: self.series.remove(0) def clear_table(self): 清空表格与波形 self.table.setRowCount(0) self.series.clear() self.data_count 0 if __name__ __main__: app QApplication(sys.argv) win MainWindow() win.show() sys.exit(app.exec())PySide6 示例UDP 报文监控简易上位机功能窗口分面板参数设置、报文接收表格、实时波形曲线QChartQTimer 模拟 UDP 接收数据你后续可以直接替换成真实 socket recv收到数据自动填入表格同时绘制波形【开始 / 停止】按钮控制采集清空表格按钮
返回列表