在學過網站之后,對于這個其實大同小異,相對應的都有差不多的版塊,個人覺得這個要簡單很多
這兩個模塊用到現在,在使用上并沒有碰到什么區別,只是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,按需自行修改designer
一個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) 物件被銷毀時
待更........
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/167461.html
標籤:Python
上一篇:excel相關
