04_HUD_Qt_for_Python开发之路2
欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈。
文章目录
- HUD_Qt_for_Python开发之路2
- 1 设置程序名称
- 2 隐藏窗口标题栏
- 3 设置窗口透明裁剪
- 4 修改下窗口大小,重新加载
- 5 搞定网络模块
- 5.1 包含网络模块
- 5.2 初始化UDP Socket
HUD_Qt_for_Python开发之路2
1 设置程序名称
本片我们将正式开始我们HUD仪表的开发工作。这一篇首先要给我们的窗口重新命名为HUD使用代码如下:
widget.setWindowTitle("HUD")
,代码位置如下图所示。
2 隐藏窗口标题栏
Python在Qt的中API基本还是保持了Qt原有的样子,好多东西还是可以参照的,就比如这个已隐藏窗口的标题栏,在传统C++中,我们使用setWindowFlag(Qt::FramelessWindowHint);
在Python中使用setWindowFlag(QtCore.Qt.FramelessWindowHint,True)
,是不是很相似,现在看下我们整个main.py程序的全貌。
# This Python file uses the following encoding: utf-8
import sys
import osfrom PySide6 import QtCore
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import QFile
from PySide6.QtUiTools import QUiLoaderclass HUD(QWidget):def __init__(self):super(HUD, self).__init__()self.load_ui()def load_ui(self):loader = QUiLoader()path = os.path.join(os.path.dirname(__file__), "hud.ui")ui_file = QFile(path)ui_file.open(QFile.ReadOnly)loader.load(ui_file, self)ui_file.close()if __name__ == "__main__":app = QApplication([])widget = HUD()widget.setWindowTitle("HUD") #设置标题名称widget.setWindowFlag(QtCore.Qt.FramelessWindowHint,True) #设置程序隐藏标题栏widget.show()with open("images.qss","r") as f:_style = f.read()app.setStyleSheet(_style)sys.exit(app.exec_())
3 设置窗口透明裁剪
这个专业术语怎么表达也不太确定,大致意思就是没有控件的地方,给他显示透明了对比图如下图所示。
这个也是可以参考C++样子
使用代码setAttribute(QtCore.Qt.WA_TranslucentBackground,True)
,位置如下图
自己技术太菜了,到目前位置,3个小时就研究出3句话来。想看到效果,遥遥无期呀。
4 修改下窗口大小,重新加载
在设计界面中修改主窗口大小为480*360,如下图所示。
5 搞定网络模块
5.1 包含网络模块
from PySide6 import QtNetwork
这里可以看下PyQt的 网络模块类图,如下
在我们新的HUD中,HUD与数据服务进行数据交互将使用DUP广播的形式来模拟CAN总线的数据机制,程序运行环境一般为本机或局域网路,对UDP数据有一定保证,但是决定不能像CNA总线自带CRC校验那样安全,不过来模拟数据足够了,同时在多个项目中也使用UDP广播,测试下来也没有啥问题。后续遇到问题在解决问题。数据服务器和HUD程序之间使用UDP广播,如下图所示。
5.2 初始化UDP Socket
按照帮助文档开搞,编写以下代码,就可以完成UDP模块了。
def initSocket(self):udpSocket = QUdpSocket(self) #初始化udpSocket.bind(QtNetwork.QHostAddress.LocalHost,6876) #绑定端口self.connect(udpSocket,SIGNAL('readyRead()'),self,SLOT('readPendingDatagrams'))
def readPendingDatagrams(self):while udpSocket.hasPendingDatagrams:datagram = QByteArray()datagram.resize(udpSocket.pendingDatagramSize())(sender,senderPort) = udpSocket.readDatagram(datagram.data(), datagram.size())processTheDatagram(datagram)
理想很丰满,现实很骨感,同样的代码,放在我这里就是不对的。
以我理解,大致意思就是我的参数不对。
我好像在这里发现了什么,UDP是无连接的,怎么能绑定IP呢,所以只有绑定端口一说。
修正一下,这样终于不报错误了,但是呢,还有更好玩的问题出现了。
def initSocket(self):udpSocket = QUdpSocket(self) #初始化udpSocket.bind(6876) #绑定端口
# self.connect(udpSocket,SIGNAL('readyRead()'),self,SLOT('readPendingDatagrams'))udpSocket.readyRead.connect(readPendingDatagrams)def readPendingDatagrams():while udpSocket.hasPendingDatagrams:datagram = QByteArray()datagram.resize(udpSocket.pendingDatagramSize())(sender,senderPort) = udpSocket.readDatagram(datagram.data(), datagram.size())processTheDatagram(datagram)
现在我的代码如上图所示,但是呢,提示我找不到readPendingDatagrams,如下图
接着探索,结合旧版的信号槽编写方式,猜测应该是我少加了‘好了,加上试试看
def initSocket(self):udpSocket = QUdpSocket(self) #初始化udpSocket.bind(6876) #绑定端口
# self.connect(udpSocket,SIGNAL('readyRead()'),self,SLOT('readPendingDatagrams'))udpSocket.readyRead.connect('readPendingDatagrams')def readPendingDatagrams():while udpSocket.hasPendingDatagrams:datagram = QByteArray()datagram.resize(udpSocket.pendingDatagramSize())(sender,senderPort) = udpSocket.readDatagram(datagram.data(), datagram.size())processTheDatagram(datagram)
哎嗨,好了,哈哈哈,不过是有提示,现在至少是可以运行了
还有有问题,意思是我的这个槽函数是不行的。在改改,如下图
这回终于可以了,看下结果,不容易,又是一下午。
组后附上完整代码如下:
# This Python file uses the following encoding: utf-8
import sys
import osfrom PySide6 import QtCore
from PySide6 import QtNetwork
from PySide6.QtNetwork import QUdpSocket
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import QFile,QObject
from PySide6.QtUiTools import QUiLoaderclass HUD(QWidget):def __init__(self):super(HUD, self).__init__()self.load_ui()self.initSocket()def load_ui(self):loader = QUiLoader()path = os.path.join(os.path.dirname(__file__), "hud.ui")ui_file = QFile(path)ui_file.open(QFile.ReadOnly)loader.load(ui_file, self)ui_file.close()def initSocket(self):udpSocket = QUdpSocket(self) #初始化udpSocket.bind(6876) #绑定端口
# self.connect(udpSocket,SIGNAL('readyRead()'),self,SLOT('readPendingDatagrams'))udpSocket.readyRead.connect(self.readPendingDatagrams) #新的信号槽编写方式def readPendingDatagrams(self):while udpSocket.hasPendingDatagrams:datagram = QByteArray()datagram.resize(udpSocket.pendingDatagramSize())(sender,senderPort) = udpSocket.readDatagram(datagram.data(), datagram.size())processTheDatagram(datagram)print(datagram)if __name__ == "__main__":app = QApplication([])widget = HUD()widget.setWindowTitle("HUD") #设置标题名称widget.setWindowFlag(QtCore.Qt.FramelessWindowHint,True) #设置程序隐藏标题栏widget.setAttribute(QtCore.Qt.WA_TranslucentBackground,True) #设置窗口透明widget.show()with open("images.qss","r") as f:_style = f.read()app.setStyleSheet(_style)sys.exit(app.exec_())
04_HUD_Qt_for_Python开发之路2相关推荐
- 记本阶段建站心得,是走无限做垃圾站之路还是真正的开发之路
不知不觉,上班有三个月了,三个月除却一些公司里杂七杂八的事,我做了四个站,第一个是六安市志愿者会员管理系统,比较简单,用TP开发,从前台设计.布局,到数据库设计,再到后台代码,改了又改,最后花了近一个 ...
- 我的Java开发之路
最近有一位小伙伴通过公众号给我留言, "我参加工作没多久,看着圈里的技术大牛,特别羡慕,也渴望成为技术大牛,想让您分享一下从小白到大牛是怎样练成的,我该如何提高自己" 首先,谢谢这 ...
- 细说inchat系统客户端开发之路
Inchat系统中间件基础运行环境是经过统一规划的以WebLogic.JBOSS为主的集群环境,企业集成平台是以基础业务应用为基础服务于上层平台和基础业务应用的高度集成平台,数据中心是企业公共数据的集 ...
- Qt开发之路39---Qt pro项目检测编译器版本(64位或32位)
方案一:利用QT_ARCH contains(QT_ARCH, x86_64){message("64-bit") }else{message("32-bit" ...
- 攀岩时代:HMS Core 6.0与移动开发之路
今年的东京奥运会中,一些全新运动项目首次进入奥运是一大看点.其中就包括科技界经常用以比喻自己的:攀岩. 刚刚加入奥运大家庭的攀岩运动,需要选手在陡峭的崖壁,甚至负角度情况下,在仅有的几个发力点支撑下向 ...
- 我的App开发之路:从零开始到上线赚钱
我的App开发之路:从零开始到上线赚钱 背景介绍 本人从第一次写代码赚钱开始,到现在已经12年了,使用过多种操作系统.编程语言. 现在作为一名个人开发者,开发一些小应用. 本文就应用软件开发做个简单总 ...
- H5前端开发以及小程序开发之路
好久没写博客了,今天心血来潮.总结下.近一年的前端开发之路. 首先,用了ionic+cordova技术框架开发纯粹的混合APP(得有angular的基础知识),一个商城项目,也用了vue,编写单页面, ...
- Qt开发之路44---Qt Creator 设置移动控件的最小距离
一:问题 Qt Creator编辑UI时,按上下左右间移动控件默认最小是10个像素点,可不可以设置小一些? 二:方法,配置更改 工具-选项-设计师-表单-栅格X/栅格Y,调整大小!如下图 三:方法,属 ...
- 05_HUD_Qt_for_Python开发之路3
欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈. 文章目录 HUD_Qt_for_Python开发之路3 1 UI文件与Python结合 1.1 将UI文件编译为一个Pytho ...
最新文章
- 两个数组找相同元素_Excel 数组公式全面解析
- 万万没想到,一个可执行文件原来包含了这么多信息!
- Android当中layer-list使用来实现多个图层堆叠到一块儿
- 推荐21个顶级的Vue UI库! – TalkingData‘s Blog
- mysql分库一致性_分库分表带来的完整性和一致性问题
- mysql new map_使用构造器模式动态构建Map作为mybatis的查询条件
- Fedora中systemctl命令的使用
- linux查看jdk详细版本号,Linux中查看jdk版本
- 将 PAGE_VERIFY 数据库选项设置为 CHECKSUM
- Flask-login 原理
- 设计模式笔记(21)---备忘录模式(行为型)
- 华为延期,三星下架,讲讲折叠屏为什么这么难
- 辽宁运钞车被劫:加强安防管理刻不容缓
- 计算机连接无线网络的步骤,手机连接电脑wifi上网的方法步骤
- 豆丁 道客巴巴 千图网 千库网 包图网 我图网 摄图网 巧办网 万方设计 中国知网 VIP会员一个月开通方法,十网通用
- 凸性与久期在python中实现
- Gitbub远程仓库的访问
- 综述:根际微生物组提高植物耐盐性的研究进展
- 实战小项目——基于STM32的蓝牙小车
- Vue开发历程---音乐播放器的继续
热门文章
- java报错XX cannot be resolved to a type
- mysql中replace into效率_MYSQL中replace into的用法
- 小米Note 2:没有继承三星Note 7的衣钵,却抢了锤子的饭碗
- 蚂蚁集团深耕海外支付在俄罗斯成立合资企业
- android手机 usb hub,绿联PD HUB,让手机秒变台式机电脑般体验的利器
- 我的世界暮色森林java下载_我的世界暮色森林mod下载-我的世界暮色森林1.12.2下载-Minecraft中文分享站...
- 6月3日至5日 服务器信息维修,6月3日服务器例行维护公告
- 元宇宙和web3.0的前世今生
- 自动驾驶,离真正量产还差什么?
- I. Where Am I?