欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈。
文章目录
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 os
from PySide6 import QtCore
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import QFile
from PySide6.QtUiTools import QUiLoader
class 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 os
from 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 QUiLoader
class 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_())