PyQt入門(第一個PyQt應用)

PyQt入門(第一個PyQt應用)

一、PyQt介紹

PyQt是一個創建GUI應用程序的工具包。它是Python編程語言和Qt庫的成功融合。Qt庫是目前最強大的庫之一。PyQt是由Phil Thompson 開發。

PyQt實現了一個Python模塊集。它有超過300類,將近6000個函數和方法。它是一個多平臺的工具包,可以運行在所有主要操作系統上,包括UNIX,Windows和Mac。 PyQt採用雙許可證,開發人員可以選擇GPL和商業許可。在此之前,GPL的版本只能用在Unix上,從PyQt的版本4開始,GPL許可證可用於所有支持的平臺。

二、python GUI框架簡介,pyqt介紹,爲什麼使用pyqt

python開發GUI程序,瞭解一個框架需要了解:

(1)運行效果
(2)能夠運行在哪些平臺
(3)學習成本,因爲每一個GUI框架都有自己的特點
(4)開發效率的比較,python的運行效率比c c++低,但是開發效率是比較快的

python GUI框架:

(1)Tkinter: python內置的GUI框架,使用TCL實現,python中內嵌了TCL解釋器,使用它的時候不用安裝額外的擴展包,直接import,跨平臺。不足之處在於UI佈局全靠代碼實現,只有15種常用部件,顯示效果簡陋。
(2)Wxpython:用得比較廣泛,跨平臺,C++編寫,需要安裝擴展模塊;文檔少,遇到問題不好解決,代碼佈局控件,不直觀。
(3)Pygtk: python對GTK+GUI庫的封裝,在linux平臺上運行的比較好,需要安裝擴展模塊,在windows下的兼容性有一些問題。
(4)pyqt:QT原本是諾基亞的產品,源碼用C++寫的,python對QT的包裝,跨平臺,本地顯示效果,根據系統決定,在win7下就是win7的顯示效果;pyqt與qt的函數接口一致,qt開發問的那個豐富,所以pyqt開發文檔也比較豐富;控件豐富,函數/方法多,拖曳佈局;方便打包成二進制文件;GPL協議,商業程序需要購買商業版授權
(5)pyside:諾基亞的親兒子,python對QT的封裝,安裝擴展模塊,跨平臺,與pyqt的API一樣,LGPL協議,新軟件可以是私有的,代碼佈局
(6)Kivy: 針對多點觸控程序,智能手機平板等,也可以在沒有觸屏功能的系統上,全平臺支持;使用python和cython(python和c語言的接口)編寫;中文支持差,需要自己下載中文庫並且制定路徑。

爲什麼使用pyqt:

  1. 因爲API與qt一致,學會了pyqt再使用qt很簡單
  2. 文檔豐富
  3. 學習成本低
  4. 開發迅速,qt designer拖曳佈局,如果使用代碼佈局還需要構建全局並且調試
  5. 學習經驗容易遷移到pyside來開發商業應用
  6. 方便打包發佈軟件,python本身解釋語言的特點是寫好的程序不編譯和鏈接,使用文本運行解釋器,邊解釋邊執行,用戶不可能裝一個解釋器再發源碼再執行,所以打包成exe再發布

三、安裝與配置

1.安裝

安裝pyqt5

pip install pyqt5or pip3 install pyqt5

Windows安裝PyQt-tools

pip3 install pyqt5-tools

Mac和Linux都不支持PyQt5-tools所以直接安裝Qt Designer即可

  • Mac

    pip install Qt

  • Linux

    注:由於我用的Manjaro已經內置了Qt Designer,所以這裏寫ubuntu下的安裝方法

    sudo apt-get install qt5-default qttools5-dev-tools

terminal中查看是否安裝成功PyQt

 rex@rex-linux  ~  pip list
Package              Version 
-------------------- --------
appdirs              1.4.3   
btrfsutil            1.1.1   
CacheControl         0.12.5  
chardet              3.0.4   
colorama             0.4.1   
cupshelpers          1.0     
distlib              0.2.9   
distro               1.4.0   
docopt               0.6.2   
html5lib             1.0.1   
idna                 2.8     
Jade-Application-Kit 2.0.7   
keyutils             0.5     
lockfile             0.12.2  
louis                3.10.0  
msgpack              0.6.1   
npyscreen            4.10.5  
numpy                1.16.4  
opencv-python        4.1.0.25
packaging            19.0    
pacman-mirrors       4.14.2  
pep517               0.5.0   
Pillow               6.1.0   
pip                  19.0.3  
progress             1.5     
pwquality            1.4.0   
pycairo              1.18.1  
pycups               1.9.74  
pycurl               7.43.0.2
PyGObject            3.32.2  
pyparsing            2.4.0   
PyQt5                5.13.0  
PyQt5-sip            4.19.18 
pysmbc               1.0.16  
pytoml               0.1.20  
PyYAML               5.1     
reportlab            3.5.23  
requests             2.22.0  
retrying             1.3.3   
setuptools           41.0.1  
six                  1.12.0  
team                 1.0     
udiskie              1.7.7   
urllib3              1.25.3  
webencodings         0.5.1 

如圖所示我們已經安裝成功了PyQt5

2.配置

若你已經可以在你的應用程序菜單裏找到Qt Designer那就可以了

[外鏈圖片轉存失敗(img-cdK7Yi3o-1563843564530)(https://s2.ax1x.com/2019/07/20/eS1iCT.png)]

PyCharm配置

注:PyCharm安裝激活方法自行百度,這裏不提供

  • 打開PyCharm
  • File->Setting->Tools->External Tools

[外鏈圖片轉存失敗(img-TwIbK8xa-1563843564532)(https://s2.ax1x.com/2019/07/20/eS1Uat.png)]

  • 點擊加號,依次填入

    Name:Qt Designer
    
    Group:Qt
    
    Program:usr/local/designer
    
    Arguements:$FileName$
    
    Working directory:$ProjectFileDir$
    

[外鏈圖片轉存失敗(img-4xnGka2t-1563843564534)(https://s2.ax1x.com/2019/07/20/eS1wPf.png)]

  • 再次點擊加號輸入

    Name:PyUIC
    
    Group:Qt
    
    Program:/usr/bin/python3
    
    Arguements:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
    
    Working directory:$FileDir$
    

[外鏈圖片轉存失敗(img-mSRNAKyo-1563843564535)(https://s2.ax1x.com/2019/07/20/eS38YV.png)]

  • Ok->Apply

到這裏PyCharm的配置基本結束

四、第一個PyQt應用程序

1.UI設計

  • 打開PyCharm新建一個基於venv的python項目

  • 在Setting的Project interpreter中查看是否有PyQt沒有的話自行添加

[外鏈圖片轉存失敗(img-QeaQqMLq-1563843564537)(https://s2.ax1x.com/2019/07/20/eS30T1.png)]

  • 打開Tools->QT->Qt Designer

[外鏈圖片轉存失敗(img-Y2gwr3fs-1563843564538)(https://s2.ax1x.com/2019/07/20/eS3f0A.jpg)]

  • 新建一個MainWindow ui界面

  • 向上拖拉控件並保存名爲firstMainWindow.ui

[外鏈圖片轉存失敗(img-2JMjRxiL-1563843564543)(https://s2.ax1x.com/2019/07/20/eS3qXQ.png)]

2.ui文件轉換爲.py文件與代碼編寫和運行

要想.ui文件可以被我們程序讀取有兩種方法

  • 使用命令行來將.ui編譯爲.py文件

    pyuic5 -o firstMainWindow.py firstMainWindow.ui
    

    編譯完成後的firstMainWindow.py文件內容

  from PyQt5 import QtCore, QtGui, QtWidgets
  
  
  class Ui_MainWindow(object):
      def setupUi(self, MainWindow):
          MainWindow.setObjectName("MainWindow")
          MainWindow.resize(800, 600)
          self.centralwidget = QtWidgets.QWidget(MainWindow)
          self.centralwidget.setObjectName("centralwidget")
          self.listWidget = QtWidgets.QListWidget(self.centralwidget)
          self.listWidget.setGeometry(QtCore.QRect(140, 60, 531, 371))
          self.listWidget.setObjectName("listWidget")
          MainWindow.setCentralWidget(self.centralwidget)
          self.menubar = QtWidgets.QMenuBar(MainWindow)
          self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 30))
          self.menubar.setObjectName("menubar")
          self.menuFile = QtWidgets.QMenu(self.menubar)
          self.menuFile.setObjectName("menuFile")
          self.menuEdit = QtWidgets.QMenu(self.menubar)
          self.menuEdit.setObjectName("menuEdit")
          MainWindow.setMenuBar(self.menubar)
          self.statusbar = QtWidgets.QStatusBar(MainWindow)
          self.statusbar.setObjectName("statusbar")
          MainWindow.setStatusBar(self.statusbar)
          self.actionNew = QtWidgets.QAction(MainWindow)
          self.actionNew.setObjectName("actionNew")
          self.actionOpen = QtWidgets.QAction(MainWindow)
          self.actionOpen.setObjectName("actionOpen")
          self.menuFile.addAction(self.actionNew)
          self.menuFile.addAction(self.actionOpen)
          self.menubar.addAction(self.menuFile.menuAction())
          self.menubar.addAction(self.menuEdit.menuAction())
  
          self.retranslateUi(MainWindow)
          QtCore.QMetaObject.connectSlotsByName(MainWindow)
  
      def retranslateUi(self, MainWindow):
          _translate = QtCore.QCoreApplication.translate
          MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
          self.menuFile.setTitle(_translate("MainWindow", "File"))
          self.menuEdit.setTitle(_translate("MainWindow", "Edit"))
          self.actionNew.setText(_translate("MainWindow", "New"))
          self.actionOpen.setText(_translate("MainWindow", "Open"))
  
  • 使用代碼直接讀取.ui文件

    這裏我們還是依舊兩種方法來讀取.ui文件

    1.使用我們編譯好的firstMainWindow.py文件

    2.直接讀取.ui文件

    • 使用firstMainWindow.py文件

      編寫一個叫CallFirstMainWin.py文件,內容如下

    import sys
    from PyQt5.QtWidgets import  QApplication, QMainWindow
    from firstMainWin import *
    class MyMainWindow(QMainWindow, Ui_MainWindow):
    
    
        def __init__(self, parent=None):
            super(MyMainWindow, self).__init__(parent)
            self.setupUi(self)
    
    
    if __name__ == "__main__":
        app=QApplication(sys.argv)
        myWin = MyMainWindow()
        myWin.show()
        sys.exit(app.exec_())

這裏我們繼承了firstMainWindow.py中的Ui_MainWindow類來使用我們設計的UI

  • 直接讀取.ui文件
    import sys
    from PyQt5.QtWidgets import  QApplication, QMainWindow
    from firstMainWin import *
    from PyQt5.uic import loadUi
    
    app = QApplication(sys.argv)
    widget = loadUi('firstMainWin.ui')
    widget.show()
    sys.exit(app.exec_())

這裏是直接使用了loadUi方法來讀取了ui文件

注意:爲了保障界面與邏輯分離我們大部分情況下都使用第一種方法,通過繼承界面文件的主窗口類來完成界面和邏輯的分離

兩種方式都可以成功運行

End

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章