1. 程式人生 > >pyqt5之簡單視窗的建立

pyqt5之簡單視窗的建立

   在學完tkinter後,發現tkinter在佈局方面特別的不方便(Tkinter資料:http://effbot.org/tkinterbook/tkinter-index.htm),
因此學習pyqt5,之前用tkinter寫了一個簡單的python入門教程的exe,基本都是面向過程的程式設計思想,
很少將函數語言程式設計思想和麵向物件的思想,在學習pyqt5的過程中,希望培養面向物件程式設計的思想!
關於pyqt5的學習主要參考下面的教程,部分知識及程式碼相當於是對PyQt5 tutorial的總結!
  http://zetcode.com/gui/pyqt5/introduction/

.pyqt5各個模組功能
QtCore 模組包含了非GUI的功能設計。
這個模組被用來實現時間,檔案和目錄,不同資料型別,流,URL,mime型別,執行緒和程序。
QtGui 模組包含的類用於視窗化的系統結構,事件處理,2D繪圖,基本圖形,字型和文字。
QtWidgets 模組包含的類提供了一套UI元素來建立經典桌面風格使用者介面。
QtMultimedia 模組包含的類用於處理多媒體內容和連結攝像頭和無線電功能的API。
QtBluetooth 模組包含的類用於掃描藍芽裝置,並且和他們建立連線互動。
QtNetwork 模組包含的類用於網路程式設計,這些類使TCP/IP和UDP客戶端/服務端程式設計更加容易和輕便。
QtPositioning 模組包含的類用於多種可獲得資源的位置限定,包含衛星定位,Wi-Fi,或一個文字檔案。
Enginio 模組用於解決客戶端訪問Qt雲服務託管。
QtWebSockets 模組包含的類用於解決WebSocket通訊協議。
QtWebKit 包含的關於瀏覽器的類用於解決基於WebKit2的支援庫。
QtWebKitWidgets 模組包含的關於WebKit1的類基本解決瀏覽器使用基於QtWidgets應用問題。
QtXml 模組包含的類用於解析XML檔案。這個模組提供SAX和DOM API解決方法。
QtSvg 模組提供類用於顯示SVG檔案內容。Scalable Vector Graphics (SVG) 是一種語言,
XML來描述二維圖形和圖形應用程式。
QtSql模組提供類驅動資料庫工作。
QtTest 模組包含了方法提供PyQt5應用的單元測試

. PyQT4 and Pyqt5 fifferences
不相容pyqt4, 模組被改寫,新模組的引入

.簡單視窗的建立
沒有父類的元件是頂級視窗。
見例子

.關閉視窗
QPushButton(string text, QWidget parent = None)
text引數是將顯示在按鈕中的內容。parent引數是一個用來放置我們按鈕的元件

qbtn.clicked.connect(QCoreApplication.instance().quit)
PyQt5中,事件處理系統由訊號&槽機制建立。如果我們點選了按鈕,訊號clicked被髮送。
槽可以是Qt內建的槽或Python 的一個方法呼叫。QCoreApplication類包含了主事件迴圈;
它處理和轉發所有事件。instance()方法給我們返回一個例項化物件。
注意QCoreAppli類由QApplication建立。點選訊號連線到quit()方法,將結束應用。
事件通訊在兩個物件之間進行:傳送者和接受者。傳送者是按鈕,接受者是應用物件


  1 import sys
  2 from PyQt5.QtWidgets import (QWidget, QToolTip,
  3     QPushButton, QApplication)
  4 from PyQt5.QtGui import QIcon
  5 from PyQt5.QtGui import QFont
  6 from PyQt5.QtCore import QCoreApplication
  7 
  8 # ----------------------------------------------#
  9 # 簡單pyqt5
 10 # ----------------------------------------------#
11 12 13 def create_ui(): 14 app = QApplication(sys.argv) # 所有pyqt5必須建立一個QApplication物件 15 16 w = QWidget() # 沒有父類的widget將被作為視窗使用 17 w.resize(250, 150) # 大小 18 w.move(300, 300) # 起始座標 19 w.setWindowTitle('GUI') # 標題 20 w.show() 21 # 應用進入主迴圈。在這個地方,事件處理開始執行。
22 # 主迴圈用於接收來自視窗觸發的事件,並且轉發他們到widget應用上處理。 23 # 如果我們呼叫exit()方法或主widget元件被銷燬,主迴圈將退出。 24 # sys.exit()方法確保一個不留垃圾的退出。 25 # 系統環境將會被通知應用是怎樣被結束的 26 sys.exit(app.exec_()) 27 28 29 # ----------------------------------------------# 30 # pyqt5修改顯示圖示 31 # ----------------------------------------------# 32 class Example1(QWidget): 33 34 def __init__(self): 35 super().__init__() 36 # super()方法返回了父類物件並呼叫了父類的構造方法 37 self.__init_ui() 38 39 def __init_ui(self): 40 41 self.setGeometry(300, 300, 300, 220) 42 self.setWindowTitle('GUI') 43 self.setWindowIcon(QIcon('f.ico')) 44 45 self.show() 46 47 # ----------------------------------------------# 48 # pyqt5顯示提示框 49 # ----------------------------------------------# 50 51 52 class Example2(QWidget): 53 54 def __init__(self): 55 super().__init__() 56 self.__init_ui() 57 58 def __init_ui(self): 59 60 # 設定提示框的字型和大小 61 QToolTip.setFont(QFont('SansSerif', 20)) 62 63 # 用於顯示元件的提示框 64 self.setToolTip('This is a <b>QWidget</b> widget') 65 66 # 建立一個按鍵 67 btn = QPushButton('Button', self) 68 69 # 為按鍵建立提示框 70 btn.setToolTip('This is a <b>QPushButton</b> widget') 71 72 # setHint()方法給了按鈕一個推薦的大小 73 btn.resize(btn.sizeHint()) 74 btn.move(50, 50) 75 76 self.setGeometry(300, 300, 300, 200) 77 self.setWindowTitle('Tooltips') 78 self.show() 79 80 # ----------------------------------------------# 81 # 關閉視窗 82 # ----------------------------------------------# 83 84 85 class Example3(QWidget): 86 87 def __init__(self): 88 super().__init__() 89 90 self.__init_ui() 91 92 def __init_ui(self): 93 btn = QPushButton('Quit', self) 94 btn.clicked.connect(QCoreApplication.instance().quit) 95 btn.resize(btn.sizeHint()) 96 btn.move(50, 50) 97 98 self.setGeometry(300, 300, 250, 150) 99 self.setWindowTitle('Quit button') 100 self.show() 101 102 # 測試簡單的建立ui 103 104 105 # create_ui() 106 107 app = QApplication(sys.argv) 108 109 # pyqt5修改顯示圖示 110 # ex = Example1() 111 112 # pyqt5顯示提示框 113 # ex1 = Example2() 114 115 # pyqt5退出命令,理解訊號與槽 116 ex2 = Example3() 117 sys.exit(app.exec_())