pyside2 與pyqt5 part1


在學過網站之后,對於這個其實大同小異,相對應的都有差不多的版塊,個人覺得這個要簡單很多

這兩個模塊用到現在,在使用上並沒有碰到什么區別,只是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)   對象被銷毀時  

        

待更........


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM