發表於 PyQT5Python

【Python】PyQT5 Sin,Cos Matplotlib 動畫應用程式 -1 PyQT5 基礎類別使用 QMainWindow

Hello~ Internet!
這是這個系列的第一篇,我當作大家都第一次使用 PyQt5,所以我來介紹一點基礎類別和如何開始製作第一個 PyQt5 應用程式吧!

這篇會介紹到:

  • 視窗類別
  • PyQt5 座標系統
  • QMainWindow 幾何結構
  • 建立第一個 PyQt5 應用程式

視窗類別

首先,先介紹一下可以製作應用程式的 class 吧!
總共有 3 種 class 可以製作視窗:

  • QMainWindow
  • QWidget
  • QDialog

可以繼承自己製作 class 繼承它們來創建,或是可以直接使用它們。
不過通常都會繼承之後在使用,客製化自己的 class 會比較方便嘛~
這一次我也不例外,會繼承 QMainWindow 來製作這次的小專案!
我們一一來介紹吧!

QMainWindow

這個是最常見的視窗類型,它包含功能表、工具列、狀態列等等。
如果沒有特別的需求的話,通常都是使用 QMainWindow 來製作應用程式的

QDialog

這是對話框的視窗類別,通常都是用來製作跳出視窗的那種操作功能。
像是我就用 QDialog 來製作歷程紀錄的功能( 之前的 Case 作法! )
相較於 QMainWindow,QDialog 並沒有狀態列功能列等等的介面喔!

QWidget

這個算是所有介面物件的 BaseClass,你可以用在幾乎所有地方,像是基本的視窗或是想要製作一個介面嵌入 QMainWindow 中都可以,只要實做 QWidget 就可以了。

PyQt5 座標系統

這邊主要是想提醒一下座標的算法。

PyQt5 的座標算法是
X 軸: 由左至右遞增
Y 軸: 由上至下遞增
最左上方為 (0, 0)
(可參考下圖)

為什麼要特別提醒呢?
因為我之後希望製作另外一系列的專案教學分享 — PyOpenGL
它的座標系統完全不一樣,怕有讀者搞混我就特地講解一下啦~

至於座標系統可以用在哪裡呢?
可以用在動態創建的物件上,以免遮蔽其他物件

PyQt5 視窗座標系統

QMainWindow 幾何結構

如果一個元件有包含下層的元件的話就是父視窗
如果一個視窗沒有任何的父視窗的話,那就是 Top Level Window(頂層視窗)
而 QMainWindow 就是一個 Top Level Window。

而 Top Level Window 並不可以設定自己的 Layout,因為它已經有預設的 Layout了,QMainWindow 的預設 Layout 就是下面這張圖。

下面這張其他都蠻好理解的,我講兩個比較特別的東東

Central Widget

在使用 QMainWindow 時需要記得設定中西式窗要顯示的 Widget
可以當作視窗的主要物件喔!
設定方法就像下面這樣

centralwidget = QtWidgets.QWidget(MainWindow)
Dock Widgets

從名詞上來看就可以知道它是複數的,也就是可以放很多個這種Widget。
這是一種可以拖動的介面元素,我在另外一個系列會介紹到的
盡請期待囉~

建立第一個 PyQt5 應用程式

說了這麼多的介紹,我們就來直接時做第一個 PyQt5 應用程式吧!

記得先安裝需要用到的套件喔!

pip install PyQt5

安裝完以後我們就先 import 我們需要的套件吧!

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget

還記得我說過,我都會藉由繼承 QMainWindow 來實做介面吧!
所以我們第一步要製作一個 class

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.button = QtWidgets.QPushButton(self)
        self.button.setText("Hello")

在上面的程式中我創了一個 class 叫做 MainWindow,繼承了最常用的 QMainWindow 類別,加入了一個目前並沒有任何作用的 button 將它的文字顯示為 “Hello"。

沒錯! 就是這麼簡單!有沒有覺得並不難呢~?

接下來我們就要呼叫這個 class了

app = None
window = None

if __name__ == "__main__":    
    app = QApplication(sys.argv)  # 我們需要 QApplication 幫忙我們保持在應用程式的 loop 當中
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

那這樣我們就做好第一個 PyQt5 應用程式啦~~~
(恭喜恭喜~
現在的應用程式還沒有什麼功能,不過別擔心!
下一篇會教大家怎麼觸發事件,總共有三種方法

這邊給大家完整的程式碼跑跑看喔!

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.button = QtWidgets.QPushButton(self)
        self.button.setText("Hello")
app = None
window = None

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

結尾:

不知道大家覺得這樣的系列文好不好 在下面留言告訴我喔
或是有什麼其他的想法都可以告訴我喔~
(不敢公開留言的話可以用 聯絡我 寄信跟我說喔~

那就先這樣啦!
我們下一篇見囉!

ㄅㄅ

作者:

一位 熱愛資工領域、喜歡好笑事物、偶爾打打網球 的學生 ! For A Better Me!

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.