04_HUD_Qt_for_Python開發之路2

      網友投稿 857 2025-03-31

      歡迎來到我的博客,希望這篇文章對你有所幫助,如果覺得不錯,請搜藏哈。

      文章目錄

      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 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的 網絡模塊類圖,如下

      在我們新的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)

      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

      04_HUD_Qt_for_Python開發之路2

      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

      Python Qt Windows

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel2010如何鎖定單元格(Excel中如何鎖定單元格)
      下一篇:文檔中的表格如何按數字大小排序(表格中怎樣按照數字大小排序)
      相關文章
      亚洲国产精品成人精品软件 | 亚洲在成人网在线看| 亚洲中文字幕无码久久| 久久久久亚洲av无码专区喷水| 国产亚洲一区二区在线观看| 亚洲人成无码www久久久| 亚洲av最新在线观看网址| 亚洲国产系列一区二区三区 | 亚洲第一页综合图片自拍| 亚洲狠狠婷婷综合久久| 亚洲AV第一成肉网| 亚洲人成网站在线在线观看| 在线观看亚洲AV日韩AV| 亚洲精品中文字幕| 久久精品亚洲日本波多野结衣| 亚洲av午夜电影在线观看| 国产精品国产亚洲区艳妇糸列短篇 | 亚洲国产国产综合一区首页| 亚洲91av视频| 久久国产亚洲高清观看| 久久久久亚洲AV片无码| 久久精品亚洲中文字幕无码麻豆| 亚洲精品白色在线发布| 亚洲伊人久久大香线蕉在观| 久久乐国产综合亚洲精品| 亚洲av永久中文无码精品综合| | 亚洲AV性色在线观看| 亚洲AV网站在线观看| 久久亚洲色一区二区三区| 亚洲精品无码久久千人斩| 亚洲一二成人精品区| 亚洲白色白色永久观看| 亚洲国产精品专区| 亚洲欧美aⅴ在线资源| 亚洲国产成人久久一区久久| 国产亚洲精品成人AA片新蒲金| 亚洲AV午夜成人片| 亚洲成人午夜电影| 亚洲欧美国产欧美色欲| 亚洲精品NV久久久久久久久久|