04_HUD_Qt_for_Python开发之路2

titlle bar

欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈。

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的 网络模块类图,如下

image-20210319155701981

在我们新的HUD中,HUD与数据服务进行数据交互将使用DUP广播的形式来模拟CAN总线的数据机制,程序运行环境一般为本机或局域网路,对UDP数据有一定保证,但是决定不能像CNA总线自带CRC校验那样安全,不过来模拟数据足够了,同时在多个项目中也使用UDP广播,测试下来也没有啥问题。后续遇到问题在解决问题。数据服务器和HUD程序之间使用UDP广播,如下图所示。

image-20210319161437233

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_())


博客签名2021

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamLife.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值