1. 程式人生 > >170329 PyQt5 自定義訊號與槽

170329 PyQt5 自定義訊號與槽

1625-5 王子昂 總結《2017年3月28日》 【連續第178天總結】

A.PyQt5資料傳送、處理及訊號與槽的練習

B.今天終於把手頭上的事都搞完了

資料傳輸都是很瑣碎的東西,前幾天也熟悉過了,沒有什麼難點

在str和list型別轉換的時候要注意\n換行符的影響。

中間有一段時間客戶端接收到的隨機有幾張圖顯示不出來,查了半天才發現是\n被當作檔名一起進行切割了

random模組裡有很多方便的函式,例如shuffle可以將一個列表打亂,sample可以從一個列表中隨機提取若干個元素組成一個片段

QLabel物件自己不帶單擊訊號,這個事情讓我折騰了兩個多小時來學習自定義訊號和槽的規則……_(:з」∠)_

首先需要繼承QLabel,過載mousePressEvent方法。建構函式自然需要使用原來QLabel的構造器,引數也需要對應。

mousePressEvent方法可以自動接收到滑鼠點選的訊號,相當於一個槽函式。

但是在其中寫入內容時遇到了困難:我需要識別是哪個Label被點選了,而這個方法的QMouseEvent引數只能獲取滑鼠按下的鍵和此時的座標(包括絕對座標和視窗相對座標)。又懶得一個一個計算控制元件對應的座標來死方法。於是找了半天怎麼獲取,順帶研究了一下自定義訊號與槽機制。

首先需要在構造器之外定義一個訊號signal=QtCore.pyqtSignal(str),引數可以自選,但是注意必須要與槽函式對應!

然後用connect方法繫結槽函式,再在需要觸發的地方使用emit()方法傳送訊號。emit裡的引數不能置空!

定義槽函式的時候引數一定要與訊號對應!

也可以在控制元件中繫結訊號與槽,這樣就能夠達到區分控制元件被點選的效果了。

多執行緒的複習:

完成以後伺服器端點選退出按鈕就卡死,猜測是父程序關閉,但子程序(監聽程序)仍在執行,導致整體沒有響應。

查了半天怎麼樣強行kill掉子程序,都沒有發現

最後想起來setDaemon(True),設定成保護程序。這樣在父程序需要關閉時,不會等待子程序而是直接一起關閉。

嘗試以後完全正常執行。

設定視窗置頂:

MainWindow.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
C.明日計劃
組合語言第五章