04_HUD_Qt_for_Python开发之路2

举报
DreamLife 发表于 2022/04/14 22:29:50 2022/04/14
【摘要】 欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈。 文章目录 HUD_Qt_for_Python开发之路21 设置程序名称2 隐藏窗口标题栏3 设置窗口透明裁剪4 修改...

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


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

3 设置窗口透明裁剪

这个专业术语怎么表达也不太确定,大致意思就是没有控件的地方,给他显示透明了对比图如下图所示。

在这里插入图片描述

这个也是可以参考C++样子

使用代码setAttribute(QtCore.Qt.WA_TranslucentBackground,True),位置如下图

在这里插入图片描述

自己技术太菜了,到目前位置,3个小时就研究出3句话来。想看到效果,遥遥无期呀。

4 修改下窗口大小,重新加载

在设计界面中修改主窗口大小为480*360,如下图所示。

在这里插入图片描述

5 搞定网络模块

5.1 包含网络模块

from PySide6 import QtNetwork

  
 
  • 1

这里可以看下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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

理想很丰满,现实很骨感,同样的代码,放在我这里就是不对的。

在这里插入图片描述

以我理解,大致意思就是我的参数不对。

在这里插入图片描述

我好像在这里发现了什么,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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

现在我的代码如上图所示,但是呢,提示我找不到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)


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

哎嗨,好了,哈哈哈,不过是有提示,现在至少是可以运行了

在这里插入图片描述

还有有问题,意思是我的这个槽函数是不行的。在改改,如下图

在这里插入图片描述

这回终于可以了,看下结果,不容易,又是一下午。

在这里插入图片描述

组后附上完整代码如下:

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


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

博客签名2021

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/119914698

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。