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.明日計劃
組合語言第五章