在學過網站之后,對於這個其實大同小異,相對應的都有差不多的版塊,個人覺得這個要簡單很多
這兩個模塊用到現在,在使用上並沒有碰到什么區別,只是import不同,協議不同,一個可以商用閉源,一個必須開源。如果有不同的意見歡迎評論。
在安裝時碰到的坑,先用的pyqt5,后裝的pyside2
qt5並沒有碰到過什么問題,但在安裝后者是無法運行,會報錯
this application failed to start because no qt platform plugin could....
大概就是說缺少這些東西,reinstall會管用,然后我就覺得這個小東西在放****
我又嘗試了網上的n多種方法,都無法解決我的問題......淦
其中有一個還讓pt5不能用了...
然后我在虛擬機上裝上side2,可以用,然后在主機上把qt5調回能用,我覺得可能是side2和qt5不能共存,如果有明白人看到這,留個言,蟹蟹!!!
其他相關內容自己百度去
=_=
qt5為例
梳理:
- 各種控件的特性和使用
- 控件樣式
- 資源加載
- 控件布局
- 事件和信號
- 動畫
- 跳轉
- designer
- 網絡
- 多線程
- 數據庫
- 文件操作
- 繪圖
- 多媒體
- 定時器
- 定位........
首先呢,界面編程有一個固定寫法,為了不重復寫這些東西,先設置一個關鍵字模板。
上圖~~
打開setting,搜索live
選擇python
點擊+號
關鍵字,介紹, 正文
寫完后點擊define,選擇python
ok~~

1 $輸入模板后光標停着的位置$ 2 3 from PyQt5.QtWidgets import QApplication, QWidget 4 import sys 5 6 # 創建用用程序對象 7 app = QApplication(sys.argv) 8 # 創建控件 9 window = QWidget() 10 # 控件設置 11 window.setWindowTitle('$TITLE$') 12 window.resize(500, 500) 13 $CODE$ 14 # 展示控件 15 window.show() 16 # 進入消息循環 17 sys.exit(app.exec_())

1 from PyQt5.QtWidgets import QWidget, QApplication 2 3 4 class Window(QWidget): 5 def __init__(self): 6 super().__init__() 7 self.setWindowTitle('dui') 8 self.resize(500, 500) 9 self.setup_ui() 10 11 def setup_ui(self): 12 pass 13 14 15 if __name__ == '__main__': 16 import sys 17 app = QApplication(sys.argv) 18 19 window = Window() 20 window.show() 21 22 sys.exit(app.exec_())

1 from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow 2 import untitled 3 4 5 class Window(QMainWindow): 6 def __init__(self): 7 super().__init__() 8 self.setWindowTitle('dui') 9 self.resize(500, 500) 10 11 def setupUi(self, MainWindow): 12 a = untitled.Ui_MainWindow() 13 a.setupUi(MainWindow) 14 15 16 17 if __name__ == '__main__': 18 import sys 19 20 app = QApplication(sys.argv) 21 22 window = Window() 23 def sd(): 24 print('w') 25 window.__setattr__('sd', sd) 26 window.setupUi(window) 27 window.show() 28 29 sys.exit(app.exec_()) 30 31 32 33 # 創建的QMainWindow,所以繼承自QMainWindow,按需自行修改
一個pyqt5程序都需要應用程序對象,它包含主事件循環,在其中來自窗口系統和其他資源的所有事件被處理和調度。它也處理應用程序的初始化和結束,並提供對話管理。處理絕大多數系統范圍和應用程序范圍的設置。
app.exec_()讓程序進入主循環,不要停
一個沒有父對象的控件默認不顯示,需要調用show()
一個程序中可以顯示多個頂級控件:沒有父控件就是頂級控件(有標題欄,可以設置圖標,標題,有最大化,最小化,關閉等操作) 父子關系,父輩展示,子一般會自動展示。
QtWidgets | 包含了一整套UI元素控件,用於建立符合系統風格的界面 |
QtGui | 涵蓋多種基本圖形功能,字體,圖形,圖標顏色... |
QtCore | 包的核心非GUI功能,時間,文件, 目錄, 數據類型,線程進程... |
QtWebKit | 瀏覽器引擎 |
QtTest | 測試 |
QtSql | 數據庫 |
QtMultimedia | 多媒體 |
QtMultimediaWidgets | 多媒體 |
... | ... |
一個還好用的icon庫 qtawesome https://pypi.org/project/QtAwesome/
開發中用的最多的應該是designer吧,就先來說說這個配置吧。
這個可以在文件中直接打開,也可以配置 external tools
上圖~~
點+號
program是designer的路徑,working directory是工作目錄,填這個就可,可點insert找
配置轉碼
arguments: -m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
找到菜單欄的Tools中的 external tools中剛配置好的designer
至此,就配置好了
控件 看源碼
1.Qobject基類 這是為了記錄部分常用公有的API。
setObjectName('唯一名稱') | 給qt對象設置一個名稱 類似 id |
objectName() | 獲取 |
setProperty(''屬性名稱'', 值) | 給qt對象設置一個屬性 類似 class |
property('屬性名稱') | 獲取 |
dynamicPropertyNames() | 獲取一個對象中所有通過setProperty()設置的屬性 |
setParent(parent) | 給qt對象設置父對象 只能有一個 |
parent() | 獲取父對象 |
children() | 獲取所有子對象 |
findChild(a, [b], c) | 獲取某個指定名稱和類型的子對象 |
findChildren(a, [b], c) | 獲取多個指定名稱和類型的子對象 |
參數:a: 類型, 類型元組 QObject (QPushButton,QLabel)
b:名稱,可省略
c: 查找方式:Qt.FindChildrenRecursively(遞歸查找,默認)
Qt.FindDirectChildrenOnly(只查找直接子對象)
內存管理機制:QObject:1.所有對象都直接或間接繼承自QObject
2.當創建一個QObject時,如果使用了其他對象作為父對象,那么會添加到父對象的children()列表中
3.當父對象被銷毀時,這個QObject也會被銷毀
控件,QWidget:當一個控件設置了父控件,會包含在父控件內部,受父控件區域剪裁,在父控件被刪除時,子控件會自動刪除
如果一個控件沒有父控件,那么就會被當成頂層控件 多個頂層控件互相獨立
如果想要一個控件包含在另一個控件內部,就需要設置父子關系 顯示位置,生命周期都受父對象約束
widget.信號.connect(槽) | 連接信號與槽 |
obj.disconnect() | 取消連接 obj(控件,信號):取消控件所有連接,取消指定信號的連接 |
widget.blockSignals(bool) | 臨時阻止指定控件的所有信號與槽連接 |
widget.signalsBlocked() | 信號是否被阻止 |
widget.receivers(信號) | 返回連接到信號的接收器數量 |
信號:內置:QpushButton().pressed
QpushButton().clicked
.......
自定制:pyqtSignal()
特性:
一個信號可以連接多個槽函數
一個信號也可以連接另外一個信號
信號的參數可以是任何Python類型
一個槽可以監聽多個信號
...
事件機制:
childEvent(),customEvent(),eventFilter(),installEventFilter(),removeEventFilter(),event()
一般情況下,通過內置的信號與槽就可解決一般通訊問題,但有些控件並沒有提供我們想要的信號,我們就需要重寫具體的事件函數來捕獲產生的事件,做相應處理。QLabel沒有clicked信號
某些場景並不會把我們想要捕獲的事件傳遞給特定函數,那么我們就需要重寫事件的分發函數event()。 按下tab鍵切換焦點不會吧事件分發給keyPressEvent
如果對多個不同對象進行tab捕獲,為了不多次重寫,就需要考慮’事件過濾器‘
QApplication對象的事件過濾器可以攔截所有QObject事件,一般沒卵用,notify()會降低性能
如果一個控件沒有處理某事件則會自動傳遞給父控件處理,對此有兩個方法accept(),ignore() 前者:自己處理了事件,並告訴系統不要上傳,后者:自己忽略了事件,告訴系統繼續上傳
類型判定:
isWidgetType():是否為控件類型 繼承自QWidget類的
inherits(父類): 一個對象是否繼承(直接或間接)自某個類
對象刪除:
obj.deleteLater()
刪除一個對象時,會解除它與父對象的關系,此方法是向主消息循環發送一個event,下一次主消息循環收到這個event之后才會銷毀對象,在刪除前可做一些操作,但內存將不會釋放
startTimer(ms, Qt.TimerType) ->timer_id | 開啟定時器 |
killTimer(timer_id) | 殺死定時器 |
timerEvent() | 定時器執行事件 |
Qt.TimeType: Qt.PreciseTimer: 精確定時器,ms
Qt.CoarseTimer:粗定時器,5%誤差
Qt.VeryCoarseTimer:很粗定時器, s
語言翻譯: tr()
信號:oblectNameChanged(objectName) 對象名稱發生改變時
destroyed(obj) 對象被銷毀時
待更........