บทช่วยสอน PyQt5 พร้อมตัวอย่าง: ออกแบบ GUI โดยใช้ PyQt ใน Python

PyQt คืออะไร?

ไพคิว เป็นการผูกมัด Python ของชุดเครื่องมือวิดเจ็ตโอเพ่นซอร์ส Qt ซึ่งยังทำหน้าที่เป็นกรอบงานการพัฒนาแอปพลิเคชันข้ามแพลตฟอร์มอีกด้วย Qt เป็นที่นิยม C++ เฟรมเวิร์กสำหรับการเขียนแอปพลิเคชัน GUI สำหรับเดสก์ท็อป มือถือ และแพลตฟอร์มแบบฝังหลักทั้งหมด (รองรับ Linux, Windows, แมคโอเอส, Android, iOS, Raspberry Pi และอื่นๆ)

PyQt เป็นซอฟต์แวร์ฟรีที่พัฒนาและดูแลโดย Riverbank Computing บริษัทที่ตั้งอยู่ในประเทศอังกฤษ ในขณะที่ Qt ได้รับการพัฒนาโดยบริษัทฟินแลนด์ชื่อ The Qt Company

คุณสมบัติของ PyQT

นี่คือคุณสมบัติที่สำคัญของ PyQt:

เรียนรู้ PyQt ซึ่งประกอบด้วยคลาสมากกว่าหกร้อยคลาสซึ่งครอบคลุมฟีเจอร์ต่างๆ เช่น

  • อินเทอร์เฟซผู้ใช้แบบกราฟิก
  • ฐานข้อมูล SQL
  • ชุดเครื่องมือเว็บ
  • การประมวลผล XML
  • ระบบเครือข่าย

คุณสมบัติเหล่านี้สามารถนำมารวมกันเพื่อสร้าง UI ขั้นสูงรวมถึงแอปพลิเคชันแบบสแตนด์อโลน บริษัทใหญ่ๆ มากมายในทุกอุตสาหกรรมใช้ Qt ตัวอย่างบางส่วน ได้แก่ LG, Mercedes, AMD, Panasonic, Harman เป็นต้น

เวอร์ชัน PyQt

PyQt มีให้เลือกสองรุ่น ได้แก่ PyQt4 และ PyQt5 PyQt4 จัดเตรียมโค้ดกาวสำหรับการเชื่อมโยงเฟรมเวิร์ก Qt เวอร์ชัน 4.x และ 5.x ในขณะที่ PyQt5 จัดเตรียมการเชื่อมโยงสำหรับเวอร์ชัน 5.x เท่านั้น ด้วยเหตุนี้ PyQt5 จึงไม่สามารถใช้งานร่วมกับโมดูลรุ่นเก่าที่เลิกใช้แล้วได้ ในบทช่วยสอน Qt GUI นี้ PyQt5 จะถูกใช้สำหรับการสาธิตตัวอย่าง นอกเหนือจากสองเวอร์ชันนี้

การประมวลผลริมฝั่งแม่น้ำยังให้บริการ PyQt3D ซึ่งเป็นการเชื่อมโยงหลามสำหรับเฟรมเวิร์ก Qt3D Qt3D เป็นเฟรมเวิร์กแอปพลิเคชันที่ใช้ในการสร้างระบบจำลองแบบเรียลไทม์ด้วยการเรนเดอร์ 2D/3D

วิธีการติดตั้ง PyQt5

ในบทช่วยสอน PyQt5 นี้ เราจะเห็นวิธีการติดตั้ง PyQt สองวิธี:

  • การใช้ไฟล์ Wheel
  • การสร้างและติดตั้งจากแหล่งที่มา

Qt (อ่านว่า คัท) เป็นระบบที่ซับซ้อน และฐานโค้ด PyQt ประกอบด้วยการคอมไพล์ C++ ที่ Python โค้ดภายใต้ประทุน ดังนั้นจึงเป็นกระบวนการที่ซับซ้อนในการสร้างและติดตั้งจากซอร์สโค้ดเมื่อเปรียบเทียบกับไลบรารี Python อื่นๆ อย่างไรก็ตาม คุณสามารถติดตั้ง PyQt5 ได้อย่างง่ายดายโดยใช้ล้อ

ติดตั้งแบบมีล้อ

ล้อคือมาตรฐานใหม่ Python รูปแบบบรรจุภัณฑ์และการจัดจำหน่าย พูดอย่างง่าย ๆ ล้อคือไฟล์ ZIP ที่มีชื่อพิเศษและ .หว นามสกุลไฟล์. สามารถติดตั้งล้อได้โดยใช้ pip (Pythonตัวจัดการแพ็คเกจ) ซึ่งรวมอยู่ในค่าเริ่มต้นในเวอร์ชันล่าสุดของ Python.

ดังนั้นถ้าคุณมี Python ติดตั้ง 3.4 หรือใหม่กว่าแล้ว คุณมี pip แล้ว อย่างไรก็ตาม หากคุณกำลังใช้เวอร์ชันเก่ากว่า Pythonคุณต้องดาวน์โหลดและติดตั้ง pip ก่อนที่จะดำเนินการต่อ คุณสามารถค้นหาคำแนะนำได้ที่ลิงค์นี้: https://pypi.org/project/pip/.

ในการติดตั้ง PyQt5

ขั้นตอน 1) เปิดพรอมต์คำสั่ง
เปิด Command Prompt หรือ PowerShell ในของคุณ Windows เครื่อง

ติดตั้ง PyQt5

ขั้นตอน 2) พิมพ์ต่อไปนี้

 pip install PyQt5

ขั้นตอน 3) การติดตั้งสำเร็จ
ขั้นตอนนี้ในบทช่วยสอน PyQt5 นี้จะดาวน์โหลดแพ็คเกจ PyQt5 whl (ประมาณ 50 MB) และติดตั้งลงในระบบของคุณ

ติดตั้ง PyQt5

หรือคุณสามารถดาวน์โหลด Windows ไบนารี่สำหรับเวอร์ชันของ python ที่ติดตั้งบนคอมพิวเตอร์ของคุณ

เมื่อเสร็จแล้ว ให้ไปยังส่วนถัดไปในบทช่วยสอน PyQt5 นี้เพื่อเขียนแอป GUI แรกของคุณ

PyQt พื้นฐาน Concepts และโปรแกรมต่างๆ

เมื่อคุณติดตั้ง PyQt5 ในคอมพิวเตอร์ของคุณสำเร็จแล้ว คุณก็พร้อมที่จะเขียน Python แอปพลิเคชันการออกแบบ GUI

มาเริ่มกันด้วยแอปง่ายๆ ในบทช่วยสอน PyQt5 นี้ซึ่งจะแสดงหน้าต่างว่างบนหน้าจอของคุณ

ดับไฟหลามของคุณ IDLE และพิมพ์ตามนี้:

โปรแกรม 1

import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")
    w.show()
    sys.exit(app.exec_())

บันทึกเป็นไฟล์ app.py (ชื่อไม่สำคัญ) แล้วกด F5 เพื่อรันโปรแกรม หรืออีกวิธีหนึ่งคือดับเบิลคลิกไฟล์ที่บันทึกไว้เพื่อเปิดโปรแกรม หากคุณทำทุกอย่างถูกต้อง หน้าต่างใหม่จะเปิดขึ้นพร้อมชื่อไฟล์ว่า Guru99 ดังภาพด้านล่าง

PyQt พื้นฐาน Concepts

ยอดเยี่ยม! มันใช้งานได้ ถึงไม่มากแต่ก็พอเข้าใจพื้นฐานได้ ในบทช่วยสอน PyQt นี้ เรามาดูรายละเอียดว่าแต่ละบรรทัดในโปรแกรมของคุณทำอะไรได้บ้าง

from PyQt5.QtWidgets import QApplication, QWidget

คำสั่งนี้จะนำเข้าโมดูลทั้งหมดที่คุณต้องการเพื่อสร้าง GUI ลงในเนมสเปซปัจจุบัน โมดูล QtWidgets มีวิดเจ็ตหลักทั้งหมดที่คุณจะใช้ในสิ่งนี้ Python กวดวิชา Qt

app = QApplication(sys.argv)

ที่นี่ คุณกำลังสร้างอ็อบเจ็กต์ของคลาส QApplication ขั้นตอนนี้จำเป็นสำหรับ PyQt5 แอป UI ทุกแอปจะต้องสร้างอินสแตนซ์ของ QApplication เพื่อเป็นจุดเริ่มต้นเข้าสู่แอป หากคุณไม่สร้างมันขึ้นมา ข้อผิดพลาดจะปรากฏขึ้น

sys.argv คือรายการพารามิเตอร์บรรทัดคำสั่งที่คุณสามารถส่งผ่านไปยังแอปพลิเคชันเมื่อเปิดใช้งานผ่านเชลล์หรือในขณะที่ทำให้อินเทอร์เฟซเป็นแบบอัตโนมัติ

ในตัวอย่าง PyQt5 นี้ คุณไม่ได้ส่งผ่านอาร์กิวเมนต์ใดๆ ไปยัง QApplications ดังนั้นคุณสามารถแทนที่ด้วยโค้ดด้านล่างและไม่จำเป็นต้องนำเข้าโมดูล sys ด้วยซ้ำ

app = QApplication([])
w = QWidget()

ขั้นต่อไป เราจะสร้างอ็อบเจ็กต์ของคลาส QWidget ซึ่ง QWidget เป็นคลาสพื้นฐานของอ็อบเจ็กต์ UI ทั้งหมดใน Qt และแทบทุกอย่างที่คุณเห็นในแอปคือวิดเจ็ต ซึ่งรวมถึงกล่องโต้ตอบ ข้อความ ปุ่ม แถบ และอื่นๆ คุณสมบัติที่ช่วยให้คุณออกแบบอินเทอร์เฟซผู้ใช้ที่ซับซ้อนได้คือสามารถซ้อนวิดเจ็ตได้ กล่าวคือ คุณสามารถมีวิดเจ็ตอยู่ภายในวิดเจ็ต ซึ่งอยู่ภายในวิดเจ็ตอีกอันหนึ่ง คุณจะเห็นสิ่งนี้ในการดำเนินการในส่วนถัดไป

w.resize(300,300)

วิธีการปรับขนาดของคลาส QWidget ช่วยให้คุณสามารถกำหนดขนาดของวิดเจ็ตใดๆ ได้ ในกรณีนี้ คุณได้ปรับขนาดหน้าต่างเป็น 300px คูณ 300px

ที่นี่ คุณควรจำไว้ว่าวิดเจ็ตสามารถซ้อนกันได้ วิดเจ็ตที่อยู่ด้านนอกสุด (เช่น วิดเจ็ตที่ไม่มีพาเรนต์) เรียกว่าหน้าต่าง

w.setWindowTitle("Guru99")

เมธอด setWindowTitle() อนุญาตให้คุณส่งสตริงเป็นอาร์กิวเมนต์ซึ่งจะตั้งชื่อเรื่องของหน้าต่างเป็นสตริงที่คุณส่ง ในตัวอย่าง PyQt5 แถบหัวเรื่องจะแสดง Guru99

w.show()

show() เพียงแสดงวิดเจ็ตบนหน้าจอมอนิเตอร์

sys.exit(app.exec_())

app.exec_() วิธีการเริ่มต้น Qt/C++ ห่วงเหตุการณ์ อย่างที่คุณทราบ PyQt ส่วนใหญ่จะเขียนด้วย C++ และใช้กลไกการวนซ้ำเหตุการณ์เพื่อดำเนินการแบบขนาน app.exec_() จะส่งการควบคุมไปยัง Qt ซึ่งจะออกจากแอปพลิเคชันก็ต่อเมื่อผู้ใช้ปิดแอปพลิเคชันจาก GUI เท่านั้น นั่นคือเหตุผลที่การกด Ctrl+c จะไม่ออกจากแอปพลิเคชันเหมือนกับโปรแกรม Python อื่นๆ เนื่องจาก Qt สามารถควบคุมแอปพลิเคชันได้ เหตุการณ์ของ Python จึงไม่ได้รับการประมวลผล เว้นแต่ว่าเราจะตั้งค่าไว้ภายในแอปพลิเคชัน นอกจากนี้ โปรดทราบว่าเมธอด exec มีเครื่องหมายขีดล่างในชื่อ เนื่องจาก exec() เป็นคีย์เวิร์ดใน Python อยู่แล้ว และเครื่องหมายขีดล่างจะช่วยแก้ไขข้อขัดแย้งในการตั้งชื่อ

เหนือหน้าต่างที่ว่างเปล่า

ในส่วนก่อนหน้านี้ คุณได้เห็นวิธีสร้างวิดเจ็ตพื้นฐานใน Qt แล้ว ตอนนี้ถึงเวลาที่จะสร้างอินเทอร์เฟซที่เกี่ยวข้องมากขึ้นซึ่งผู้ใช้สามารถโต้ตอบได้อย่างแท้จริง อีกครั้งยิงของคุณ IDLE และเขียนข้อความต่อไปนี้

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

def dialog():
    mbox = QMessageBox()

    mbox.setText("Your allegiance has been noted")
    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            
    mbox.exec_()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")
    
    label = QLabel(w)
    label.setText("Behold the Guru, Guru99")
    label.move(100,130)
    label.show()

    btn = QPushButton(w)
    btn.setText('Beheld')
    btn.move(110,150)
    btn.show()
    btn.clicked.connect(dialog)

    
    w.show()
    sys.exit(app.exec_())

บันทึกไฟล์เป็น appone.py หรืออะไรก็ได้ที่คุณต้องการ แล้วกด F5 เพื่อรันโปรแกรม หากคุณไม่ได้ทำผิดพลาด IDLE จะเปิดหน้าต่างใหม่พร้อมข้อความและปุ่มดังรูปด้านล่าง

ว่างเกิน Windows

  1. เมื่อคุณคลิกที่ปุ่มในหน้าต่างแรก กล่องข้อความใหม่จะเปิดขึ้นพร้อมข้อความที่คุณเขียน
  2. ตอนนี้คุณสามารถคลิกที่ปุ่มซ่อนรายละเอียด/แสดงรายละเอียดเพื่อสลับการแสดงข้อความเพิ่มเติม

ตามที่คุณเห็น เนื่องจากเราไม่ได้ตั้งค่าชื่อหน้าต่างใดๆ ในกล่องข้อความ จึงมีการตั้งชื่อหน้าต่างเริ่มต้นโดย Python เอง

ตอนนี้มันใช้งานได้แล้ว เรามาดูโค้ดพิเศษที่คุณเพิ่มลงในตัวอย่าง PyQt5 ก่อนหน้านี้กันดีกว่า

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

สิ่งนี้จะนำเข้าวิดเจ็ตเพิ่มเติมบางส่วนที่คุณใช้ในตัวอย่าง PyQt5 ได้แก่ QLabel, QPushButton และ QMessageBox.

def dialog():
    mbox = QMessageBox()

    mbox.setText("Your allegiance has been noted")
    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            
    mbox.exec_()

ที่นี่ คุณได้กำหนดวิธีการที่ชื่อว่ากล่องโต้ตอบซึ่งจะสร้างวิดเจ็ตกล่องข้อความและตั้งค่าข้อความบางส่วนให้กับปุ่มและฟิลด์อื่น ๆ

วิธีการโต้ตอบถูกเรียกจากบล็อกหลักของโปรแกรมเมื่อมีการกดปุ่มในวิดเจ็ตเฉพาะ (ในกรณีนี้คือ btn PushButton) เหตุการณ์คลิกที่ทริกเกอร์บนปุ่มนั้นทำให้ฟังก์ชันนี้ดำเนินการ ฟังก์ชันดังกล่าวเรียกว่า slot ใน Qt และคุณจะได้เรียนรู้เพิ่มเติม สัญญาณ ที่ สล็อต ในย่อหน้าถัดไป

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")

นี่คือส่วนหลักของแอป และเช่นเดียวกับในตัวอย่างก่อนหน้านี้ คุณเริ่มต้นด้วยการสร้างอินสแตนซ์ของ QApplication ตามด้วยวิดเจ็ตง่ายๆ เช่น อินสแตนซ์ของ QWidget

label = QLabel(w)
    btn = QPushButton(w)

คุณได้เพิ่มวิดเจ็ตใหม่สองรายการในแอปพลิเคชันนี้: QLabel และ QPushButton QLabel ใช้เพื่อพิมพ์ข้อความที่ไม่สามารถแก้ไขได้หรือตัวยึดตำแหน่งภายในวิดเจ็ต ในขณะที่ QPushButton ใช้เพื่อสร้างปุ่มที่คลิกได้

สิ่งสำคัญที่ต้องสังเกตที่นี่คือเมื่อคุณสร้างป้ายกำกับและวัตถุ btn คุณกำลังส่งวัตถุหน้าต่าง (w) ไปยังตัวสร้างของ QLabel และ QPushButton นี่คือวิธีการทำงานของการซ้อนใน PyQt5 ในการสร้างวิดเจ็ตภายในวิดเจ็ตอื่น คุณจะต้องส่งการอ้างอิงของวิดเจ็ตพาเรนต์ไปยังคอนสตรัคเตอร์ของเด็ก

label.move(100,130)
btn.move(110,150)

move() ใช้เพื่อกำหนดตำแหน่งของวิดเจ็ตโดยคำนึงถึงวิดเจ็ตหลัก ในกรณีแรก ป้ายกำกับจะถูกย้าย 100px จากด้านซ้าย และ 130px จากด้านบนของหน้าต่าง

ในทำนองเดียวกัน ปุ่มจะวางไว้ 110px จากด้านซ้าย และ 150px จากด้านบนของหน้าต่าง ตัวอย่างนี้เป็นวิธีการคร่าวๆ เพื่อให้ได้เลย์เอาต์ และโดยทั่วไปไม่ได้ใช้ในการผลิต รวมไว้ที่นี่เพื่อการเรียนรู้เท่านั้น Qt รองรับเลย์เอาต์ที่แตกต่างกันซึ่งคุณจะเห็นรายละเอียดในส่วนถัดไปของบทช่วยสอน PyQt นี้

btn.clicked.connect(dialog)

สุดท้ายนี้ นี่คือตัวอย่างของสัญญาณและช่องใน Qt ในแอปพลิเคชันที่ใช้ GUI ฟังก์ชันต่างๆ จะถูกดำเนินการตามการกระทำที่ผู้ใช้ทำ เช่น การเลื่อนเมาส์ไปเหนือองค์ประกอบหรือการคลิกปุ่ม การกระทำเหล่านี้เรียกว่า เหตุการณ์- จำได้ว่า app.exec_() วิธีการโอนการควบคุมไปยัง Qt เหตุการณ์ -วนซ้ำ นี่คือสิ่งที่ Event Loop มีไว้เพื่อฟังเหตุการณ์และดำเนินการเพื่อตอบสนอง

เมื่อใดก็ตามที่มีเหตุการณ์เกิดขึ้น เช่น ผู้ใช้คลิกปุ่ม วิดเจ็ต Qt ที่เกี่ยวข้องจะเพิ่ม a สัญญาณ- สามารถเชื่อมต่อสัญญาณเหล่านี้ได้ ฟังก์ชันหลาม (เช่นฟังก์ชันไดอะล็อกในตัวอย่างนี้) เพื่อให้ฟังก์ชันดำเนินการเมื่อมีการทริกเกอร์สัญญาณ ฟังก์ชันเหล่านี้เรียกว่า สล็อต ในศัพท์แสง Qt

ต่อมา ไวยากรณ์พื้นฐานเพื่อทริกเกอร์ฟังก์ชันสล็อตเพื่อตอบสนองต่อสัญญาณจากเหตุการณ์จะเป็นดังนี้

 widget.signal.connect(slot)

ซึ่งหมายความว่าเมื่อใดก็ตามที่ สัญญาณ ถูกกระตุ้นโดย วิดเจ็ตที่เชื่อมต่อ สล็อต ฟังก์ชันจะถูกดำเนินการ โดยสรุป Qt จะใช้สัญญาณและช่องเพื่อสื่อสารระหว่างวัตถุและอำนวยความสะดวกในการนำส่วนประกอบกลับมาใช้ใหม่และการโต้ตอบ

ตอนนี้คุณรู้วิธีซ้อนวิดเจ็ตและใช้งานการโต้ตอบโดยใช้สัญญาณและสล็อตแล้ว นี่คือรายการวิดเจ็ตที่มีประโยชน์และคลาสอื่น ๆ ที่คุณสามารถใช้ในแอป PyQt ของคุณ

ส่วนประกอบและวิดเจ็ต

มีวิดเจ็ตจำนวนมากใน PyQt สำหรับการสร้างแอป GUI อย่างไรก็ตาม ด้วย PyQt5 ได้มีการสับเปลี่ยนคลาสออกเป็นโมดูลต่างๆ และมีการแก้ไขใบอนุญาต

ดังนั้นจึงจำเป็นอย่างยิ่งที่จะต้องมีมุมมองระดับสูงของโครงสร้างของ PyQt5 ในส่วนนี้ คุณจะเห็นว่า PyQt5 ได้รับการจัดระเบียบภายในอย่างไร และเรียนรู้เกี่ยวกับโมดูล ไลบรารี และคลาส API ต่างๆ ที่ PyQt5 มอบให้

โครงสร้างไดเรกทอรี PyQt5

โครงสร้างไดเรกทอรี PyQt5

เหล่านี้เป็นโมดูลพื้นฐานที่ใช้โดย Pythonการเชื่อมโยง Qt ของ โดยเฉพาะ PyQt5

  • Qt: มันรวมคลาส/โมดูลทั้งหมดที่กล่าวถึงด้านล่างเป็นโมดูลเดียว มันเพิ่มหน่วยความจำที่ใช้โดยแอปพลิเคชันอย่างมาก อย่างไรก็ตาม การจัดการกรอบงานทำได้ง่ายกว่าด้วยการนำเข้าโมดูลเดียวเท่านั้น
  • คิวทีคอร์: ประกอบด้วยคลาสหลักที่ไม่ใช่กราฟิกที่ใช้โดยโมดูลอื่น นี่คือที่ที่ลูปเหตุการณ์ Qt สัญญาณ และการเชื่อมต่อสล็อต ฯลฯ ถูกนำมาใช้
  • QtWidgets: ประกอบด้วยวิดเจ็ตส่วนใหญ่ที่มีอยู่ใน Pyqt5
  • คิวทีกุย: ประกอบด้วยส่วนประกอบ GUI และขยายโมดูล QtCore
  • QtNetwork: มีคลาสที่ใช้เพื่อดำเนินการเขียนโปรแกรมเครือข่ายผ่าน Qt รองรับเซิร์ฟเวอร์ TCP, ซ็อกเก็ต TCP, ซ็อกเก็ต UDP, การจัดการ SSL, เซสชันเครือข่าย และการค้นหา DNS
  • คิวทีมัลติมีเดีย ให้ฟังก์ชันมัลติมีเดียระดับต่ำ
  • QtSql: ดำเนินการรวมฐานข้อมูลสำหรับฐานข้อมูล SQL รองรับ ODBC, MySQL, Oracle, SQLiteและ PostgreSQL.

วิดเจ็ต PyQt5

นี่คือรายการวิดเจ็ตที่ใช้บ่อยที่สุดใน PyQt5

  • คิวไลน์แก้ไข: นี่คือช่องป้อนข้อมูลที่อนุญาตให้ผู้ใช้ป้อนข้อความได้หนึ่งบรรทัด
    line = QLineEdit()
  • QRadioButton: นี่คือช่องป้อนข้อมูลที่มีปุ่มเลือกได้ คล้ายกับปุ่มตัวเลือกใน html
    rad = QRadioButton("button title")
    rad.setChecked(True)  #to select the button by default.
  • คคอมโบBox: ใช้เพื่อแสดงเมนูแบบเลื่อนลงพร้อมกับรายการที่เลือกได้
    drop = QComboBox(w)
    drop.addItems(["item one", "item two", "item three"])
  • คิวเช็คBox: แสดงกล่องสี่เหลี่ยมที่เลือกได้ด้านหน้าฉลาก ซึ่งจะถูกกาเครื่องหมายหากเลือก คล้ายกับปุ่มตัวเลือก
    check = QCheckBox("button title")
  • คิวเมนูบาร์: จะแสดงแถบเมนูแนวนอนที่ด้านบนของหน้าต่าง คุณสามารถเพิ่มออบเจ็กต์ของคลาส QMenu ลงในแถบนี้ได้เท่านั้น อ็อบเจ็กต์ QMenu เหล่านั้นสามารถมีสตริง อ็อบเจ็กต์ QAction หรืออ็อบเจ็กต์ QMenu อื่นๆ เพิ่มเติมได้
  • QToolBar: เป็นแถบแนวนอนหรือบานหน้าต่างที่สามารถเคลื่อนย้ายภายในหน้าต่างได้ อาจมีปุ่มและวิดเจ็ตอื่นๆ
  • QTab: ใช้เพื่อแบ่งเนื้อหาของหน้าต่างออกเป็นหลายหน้าที่สามารถเข้าถึงได้ผ่านแท็บต่างๆ ที่ด้านบนของวิดเจ็ต ประกอบด้วยสองส่วน: แถบแท็บและหน้าแท็บ
  • QScrollBar: ใช้เพื่อสร้างแถบเลื่อนที่อนุญาตให้ผู้ใช้เลื่อนขึ้นและลงภายในหน้าต่าง ประกอบด้วยแถบเลื่อนแบบเคลื่อนย้ายได้ รางเลื่อน และปุ่มสองปุ่มเพื่อเลื่อนแถบเลื่อนขึ้นหรือลง
    scroll = QScrollBar()
  • QSplitter: ตัวแยกใช้เพื่อแยกเนื้อหาของหน้าต่างเพื่อให้วิดเจ็ตถูกจัดกลุ่มอย่างเหมาะสมและไม่ดูเกะกะ QSplitter เป็นหนึ่งในตัวจัดการเค้าโครงหลักที่มีอยู่ใน PyQt5 และใช้เพื่อแยกเนื้อหาทั้งแนวนอนและแนวตั้ง
  • คิวด็อก: วิดเจ็ต dock เป็นหน้าต่างย่อยที่มีคุณสมบัติสองประการ:
  • สามารถเคลื่อนย้ายภายในหน้าต่างหลักและ
  • สามารถเชื่อมต่อนอกหน้าต่างหลักไปยังตำแหน่งอื่นบนหน้าจอได้

เค้าโครงและธีม

ในตัวอย่าง PyQt5 ก่อนหน้านี้ คุณเพียงแค่ใช้เมธอด move() และ resize() เพื่อกำหนดตำแหน่งของวิดเจ็ตใน GUI ของคุณ

อย่างไรก็ตาม PyQt มีกลไกการจัดการเค้าโครงที่มีประสิทธิภาพซึ่งสามารถใช้เพื่อสร้างส่วนต่อประสานผู้ใช้ขั้นสูงสำหรับแอปพลิเคชัน ในส่วนนี้ คุณจะได้เรียนรู้เกี่ยวกับคลาสสำคัญสองคลาสที่ใช้ใน Qt เพื่อสร้างและจัดการเลย์เอาต์

  1. QBoxแบบ
  2. QGridLayout

QBoxแบบ

QBoxเค้าโครงใช้เพื่อจัดแนววิดเจ็ตลูกของเค้าโครงในแถวแนวนอนหรือแนวตั้ง คลาสที่น่าสนใจทั้งสองคลาสที่สืบทอดมาจาก QBoxเค้าโครงคือ:

  • QHBoxเค้าโครง: ใช้เพื่อวางวิดเจ็ตลูกในแนวนอน
  • QVBoxเค้าโครง: ใช้เพื่อวางวิดเจ็ตลูกในแนวตั้ง

ตัวอย่างเช่น นี่คือวิธีที่ปุ่มสามปุ่มจัดแนวกับ QHBoxเค้าโครงจะมีลักษณะ

QBoxแบบ

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":

    app = QApplication([])
    w = QWidget()
    w.setWindowTitle("Musketeers")

    btn1 = QPushButton("Athos")
    btn2 = QPushButton("Porthos")
    btn3 = QPushButton("Aramis")

    hbox = QHBoxLayout(w)

    hbox.addWidget(btn1)
    hbox.addWidget(btn2)
    hbox.addWidget(btn3)

    w.show()

    sys.exit(app.exec_())

และนี่คือลักษณะที่พวกเขาจะดูใน QVBoxแบบ

QBoxแบบ

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":

    app = QApplication([])
    w = QWidget()
    w.setWindowTitle("Musketeers")

    btn1 = QPushButton("Athos")
    btn2 = QPushButton("Porthos")
    btn3 = QPushButton("Aramis")

    vb = QVBoxLayout(w)

    vb.addWidget(btn1)
    vb.addWidget(btn2)
    vb.addWidget(btn3)

    w.show()

    sys.exit(app.exec_())

ฟังก์ชันเดียวที่ต้องการคำอธิบายในตอนนี้คือเมธอด addWidget() ใช้ในการแทรกวิดเจ็ตในรูปแบบ HBox หรือ VBox เค้าโครง นอกจากนี้ยังใช้ในเค้าโครงอื่นๆ ที่ใช้พารามิเตอร์จำนวนต่างกันดังที่คุณจะเห็นในส่วนถัดไป วิดเจ็ตจะปรากฏภายในเค้าโครงตามลำดับที่คุณแทรก

QGridLayout

QGridLayout ใช้เพื่อสร้างอินเทอร์เฟซที่มีการวางวิดเจ็ตในรูปแบบของตาราง (เช่นเมทริกซ์หรืออาร์เรย์ 2D) หากต้องการแทรกองค์ประกอบในเค้าโครงตาราง คุณสามารถใช้การแสดงเมทริกซ์เพื่อกำหนดจำนวนแถวและคอลัมน์ในตารางตลอดจนตำแหน่งขององค์ประกอบเหล่านั้น

ตัวอย่างเช่น หากต้องการสร้างตาราง 3*3 (กล่าวคือ ตารางที่มี XNUMX แถวและ XNUMX คอลัมน์) คุณจะต้องเขียนโค้ดดังต่อไปนี้:

Import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":
    app = QApplication([])

    w = QWidget()

    grid = QGridLayout(w)

    for i in range(3):
        for j in range(3):
            grid.addWidget(QPushButton("Button"),i,j)


    w.show()
    sys.exit(app.exec_())

นี่จะเป็นผลลัพธ์:

QGridLayout

วิธีการ addWidget() ในโครงร่างกริดรับอาร์กิวเมนต์เหล่านี้:

  • วัตถุวิดเจ็ตที่คุณต้องการเพิ่มลงในตาราง
  • พิกัด x ของวัตถุ
  • พิกัด y ของวัตถุ
  • แถวช่วง (ค่าเริ่มต้น =0)
  • คอลัมน์ช่วง (ค่าเริ่มต้น = 0)

เพื่อให้เข้าใจได้ดีขึ้น คุณสามารถแทรกแต่ละวิดเจ็ตด้วยตนเองตามที่แสดงด้านล่าง

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":
    app = QApplication([])

    w = QWidget()

    grid = QGridLayout(w)
    grid.addWidget(QPushButton("Button one"),0,0)
    grid.addWidget(QPushButton("Button two"),0,1)
    grid.addWidget(QPushButton("Button three"),1,0)
    grid.addWidget(QPushButton("Button four"),1,1)


    w.show()
    sys.exit(app.exec_())

นี่คือลักษณะของตาราง:

QGridLayout

คุณยังสามารถส่งพารามิเตอร์ rowspan และ colspan ไปที่ addWidget() เพื่อขยายมากกว่าหนึ่งแถวหรือคอลัมน์ได้

ตัวอย่างเช่น

grid.addWidget(QPushButton("Button five"),2,0,1,0)

ซึ่งจะสร้างปุ่มที่ขยายออกไปทั้งสองคอลัมน์

QGridLayout

ธีม

PyQt5 มาพร้อมกับธีมในตัวที่คุณสามารถใช้ในแอปของคุณได้ ที่ เซ็ตสไตล์() วิธีการที่ถูกเรียกบนอินสแตนซ์ QApplication ใช้เพื่อตั้งค่าธีมเฉพาะให้กับแอปพลิเคชันของคุณ

ตัวอย่างเช่น การเพิ่มบรรทัดโค้ดต่อไปนี้จะเปลี่ยนธีมของแอปพลิเคชันของคุณจากค่าเริ่มต้นเป็น Fusion

app.setStyle("Fusion")

นี่คือลักษณะของตัวอย่างก่อนหน้านี้ในธีมฟิวชั่น

ธีม

ฟังก์ชันที่มีประโยชน์อีกประการหนึ่งสำหรับการกำหนดธีมแอปของคุณคือเมธอด setPalette() นี่คือโค้ดสำหรับการเปลี่ยนสีของวิดเจ็ตต่างๆ โดยใช้ setPalette()

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPalette

if __name__ == "__main__":
    app = QApplication([])
    app.setStyle("Fusion")
    
    qp = QPalette()
    qp.setColor(QPalette.ButtonText, Qt.black)
    qp.setColor(QPalette.Window, Qt.black)
    qp.setColor(QPalette.Button, Qt.gray)
    app.setPalette(qp)

    w = QWidget()

    grid = QGridLayout(w)
    grid.addWidget(QPushButton("Button one"),0,0)
    grid.addWidget(QPushButton("Button two"),0,1)
    grid.addWidget(QPushButton("Button three"),1,0)
    grid.addWidget(QPushButton("Button four"),1,1)


    w.show()
    sys.exit(app.exec_())

นี่คือผลลัพธ์

ธีม

หากต้องการใช้เมธอด setPalette() คุณต้องกำหนดพาเล็ตก่อน ทำได้โดยการสร้างอ็อบเจ็กต์ของคลาส QPalette

 qp = QPalette()

โปรดสังเกตว่าคลาส QPalette เป็นของโมดูล QtGui และคุณจะต้องนำเข้าเพื่อให้สิ่งนี้ทำงานได้ เมื่อคุณสร้างวัตถุ QPalette แล้ว ให้ใช้เมธอด setColor() เพื่อส่งชื่อของวิดเจ็ตที่คุณต้องการเปลี่ยนสีและสีที่คุณต้องการตั้งค่า

 qp.setColor(QPalette.Window, Qt.black)

การดำเนินการนี้จะเปลี่ยนสีของหน้าต่างเป็นสีดำ หลังจากที่คุณได้กำหนดรูปแบบสีของคุณแล้ว ให้ใช้ฟังก์ชัน setPalette() เพื่อนำพาเล็ตไปใช้กับแอปพลิเคชันของคุณ

app.setPalette(qp)

นั่นคือทั้งหมดที่คุณต้องทำหากคุณต้องการสร้างธีมพื้นฐานสำหรับแอปของคุณ PyQt ยังอนุญาตให้คุณใช้สไตล์ชีทเพื่อกำหนดรูปลักษณ์ของวิดเจ็ตของคุณ หากคุณคุ้นเคยกับ CSS คุณสามารถกำหนดสไตล์ขั้นสูงสำหรับแอปของคุณได้อย่างง่ายดายโดยใช้ Qt Style Sheets

สรุป

  • PyQt คือการผูกมัดของ Python สำหรับ C++ กรอบงาน UI, Qt.
  • PyQt4 และ PyQt5 เป็นสองเวอร์ชันหลักที่พัฒนาโดย Riverbank Computing
  • โมดูลหลักของกรอบงาน PyQt คือ:
    1. Qt
    2. คิวทีคอร์
    3. QtWidgets
    4. คิวทีกุย
    5. QtSql
    6. QtNetwork
  • PyQt รองรับวิดเจ็ตต่าง ๆ เช่น:
    1. ปุ่ม
    2. ป้ายข้อความ
    3. ช่องข้อความ
    4. ปุ่มตัวเลือกและช่องกาเครื่องหมาย
    5. แถบเครื่องมือและแถบเมนู
    6. ชุดเว็บ
    7. แท็บ
    8. บริเวณท่าเรือ
  • ใน PyQt มีการใช้การโต้ตอบโดยใช้ สัญญาณ ที่ สล็อต
  • An เหตุการณ์ คือการกระทำที่ดำเนินการโดยผู้ใช้ใน GUI (เช่น การคลิกปุ่ม)
  • A สัญญาณ ถูกยกขึ้นโดยวิดเจ็ตที่เกี่ยวข้องเมื่อมีเหตุการณ์เกิดขึ้น
  • A สล็อต เป็นฟังก์ชันที่เชื่อมต่อกับสัญญาณและดำเนินการเมื่อมีการยกสัญญาณ
  • PyQt มีกลไกเค้าโครงที่แข็งแกร่งและรองรับการออกแบบและการจัดการเค้าโครงขั้นสูง นี่คือสองโครงร่างที่ใช้บ่อยใน PyQt:
    1. Box แบบ
    2. เค้าโครงตาราง
  • ผู้ออกแบบ PyQt ช่วยให้คุณสร้างธีมที่กำหนดเองสำหรับแอปพลิเคชัน GUI และมีการรองรับสไตล์ชีตในตัว
  • qtcreator Python สามารถใช้เพื่อสร้างส่วนต่อประสานผู้ใช้รวมถึงแอปพลิเคชันแบบสแตนด์อโลน