φυβλαςのβλογ
phyblas的博客



pyqt เบื้องต้น บทที่ ๓: การปรับแต่งหน้าต่าง
เขียนเมื่อ 2021/08/05 11:38
แก้ไขล่าสุด 2021/09/28 16:42

ต่อจาก บทที่ ๒

ในบทที่แล้วได้พูดถึงเรื่องการจัดวาง widget ต่างๆรวมถึง widget หลักที่ใช้เป็นหน้าต่างไปแล้ว สำหรับในบทนี้จะพูดถึงการปรับแต่งหน้าต่างเพิ่มเติมขึ้นไปอีก เช่นการตั้งชื่อ, การใส่รูปไอคอน, การทำให้โปร่งใส, การตั้งแฟล็กหรือสถานะ, ฯลฯ

เมธอดต่างๆที่จะแนะนำในบทนี้มีคำว่า .setWindow นำหน้า ซึ่งหมายความว่าเป็นเมธอดที่ใช้กับ widget ที่เป็นหน้าต่างเป็นหลัก เพียงแต่เมธอดเหล่านี้มีอยู่ใน widget ทั้งหมด ไม่ว่าจะถูกใช้เป็นหน้าต่างหรือไม่ก็ตาม เพียงแต่ถ้าใช้กับ widget ที่ไม่ใช่หน้าต่าง ถึงใช้ไปก็ไม่มีผลใดๆ




การตั้งชื่อหน้าต่าง {.setWindowTitle}

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

การกำหนดชื่อให้หน้าต่างทำได้โดยใช้เมธอด .setWindowTitle เช่น
import sys
from PyQt5.QtWidgets import QApplication,QWidget

qAp = QApplication(sys.argv)
natang = QWidget()
natang.setWindowTitle('ก็แค่หน้าต่างเล็กๆใบหนึ่ง')
natang.setGeometry(110,110,260,120)
natang.show()
qAp.exec_()

ก็จะได้หน้าต่างแบบนี้ ซึ่งมีชื่อตามที่เราตั้งไว้






การตั้งรูปไอคอนหน้าต่าง {.setWindowIcon}

นอกจากตั้งชื่อให้หน้าต่างแล้วก็ยังสามารถตั้งรูปไอคอนของหน้าต่างได้ด้วย โดยใช้เมธอด .setWindowIcon

เริ่มจากให้เตรียมรูปที่จะใช้เป็นไอคอนของหน้าต่างเอาไว้ ในที่นี้ขอใช้ภาพนี้เป็นตัวอย่าง เช่นเดียวกับในบทที่แล้ว

qbicon.png


ตัวอย่าง
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QIcon

qAp = QApplication(sys.argv)
natang = QWidget()
natang.setWindowTitle('หน้าต่างนี้มีภาพ')
natang.resize(210,155)
qAp.setWindowIcon(QIcon('qbicon.png')) # ตั้งรูปไอคอน
natang.show()
qAp.exec_()

ก็จะได้ภาพไอคอนนี้มาอยู่ที่หัวหน้าต่าง นอกจากนี้แล้วสำหรับใน mac ภาพไอคอนนี้จะปรากฏในแถบที่ด้านล่างด้วย






การทำให้หน้าต่างโปร่งใส {.setWindowOpacity}

หน้าต่างสามารถปรับให้โปร่งใสมองทะลุเห็นด้านหลังได้โดยใช้เมธอด .setWindowOpacity โดยใส่ค่าความทึบแสง (ค่าตั้งแต่ 0 ถึง 1)

ตัวอย่าง
import sys
from PyQt5.QtWidgets import QApplication,QWidget

qAp = QApplication(sys.argv)
natang = QWidget()
natang.setWindowTitle('หน้าต่างนี้ช่างเลือนราง')
natang.resize(220,145)
natang.setWindowOpacity(0.6)
natang.show()
qAp.exec_()

ก็จะได้หน้าต่างที่มองทะลุเห็นด้านหลังได้






การตั้งแฟล็กปรับชนิดหน้าต่าง {.setWindowFlag}

เมธอด .setWindowFlag นั้นเอาไว้ตั้งแฟล็กซึ่งกำหนดชนิดรูปแบบลักษณะการทำงานต่างๆของหน้าต่าง

รูปแบบและลักษณะการทำงานของหน้าต่างที่กำหนดขึ้นโดยแฟล็กนั้นมีหลายอย่าง ขอยกตัวอย่างเช่นการปรับให้หน้าต่างนี้เป็นหน้าต่างแบบ dialog
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtCore import Qt

qAp = QApplication(sys.argv)
natang = QWidget()
natang.resize(280,130)
natang.setWindowTitle('หน้าต่างนี้ซ่อนไม่ได้')
natang.setWindowFlag(Qt.Dialog) # ตั้งแฟล็ก
natang.show()
qAp.exec_()

ในตัวอย่างนี้ใช้เมธอด .setWindowFlag โดยใส่แฟล็ก Qt.Dialog ซึ่งเรียกใช้จาก PyQt5.QtCore แฟล็กนี้มีความหมายว่าทำให้เป็นหน้าต่างแบบ dialog

ซึ่งจะได้หน้าต่างลักษณะนี้ออกมา ข้อแตกต่างจากหน้าต่างแบบเดิมก็คือ หน้าต่างนี้จะไม่มีปุ่มสีเหลืองซึ่งใช้สำหรับย่อซ่อนหน้าต่าง



นอกจากนี้ก็ยังมีแฟล็กสำหรับตั้งเป็นชนิดหน้าต่างอื่นๆอีกเช่น Qt.Popup, Qt.Tool, Qt.ToolTip, Qt.QSplashScreen, ฯลฯ อาจลองเปลี่ยนแฟล็กดูเพื่อปรับเป็นแบบต่างๆได้




การตั้งให้หน้าต่างอยู่บนสุดเสมอ {Qt.WindowStaysOnTopHint}

เรื่องสำคัญอีกอย่างหนึ่งที่สามารถทำได้โดยการปรับแฟล็กก็คือ การกำหนดให้หน้าต่างลอยอยู่บนสุดเสมอ ไม่โดนหน้าต่างอื่นบัง ซึ่งทำได้โดยตั้งแฟล็ก Qt.WindowStaysOnTopHint
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtCore import Qt

qAp = QApplication(sys.argv)
natang = QWidget()
natang.setWindowTitle('หน้าต่างนี้อยู่บนสุดเสมอ')
natang.resize(220,115)
natang.setWindowFlag(Qt.WindowStaysOnTopHint) # ตั้งแฟล็ก
natang.show()
qAp.exec_()

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






การดูว่าแฟล็กได้ถูกตั้งไว้ที่หน้าต่างนั้นหรือไม่ {.windowFlags}

เมธอด .windowFlags นี้เอาไว้ดูแฟล็กที่ติดอยู่กับหน้าต่างในขณะนั้นได้

เมื่อเรียกใช้เมธอด .windowFlags ก็จะได้ตัวออบเจ็กต์ที่เก็บแฟล็กของหน้าต่างนั้นๆ สามารถเอามาใช้ดูว่าแฟล็กตัวนั้นๆถูกตั้งอยู่หรือเปล่าได้โดย
bool(หน้าต่าง.windowFlags() & แฟล็ก)

เช่นปกติเมื่อสร้าง QWidget ขึ้นมา แฟล็ก Qt.WindowStaysOnTopHint จะไม่ได้ถูกตั้งเอาไว้ ถ้าตรวจดูจะได้ False แต่เมื่อตั้งแฟล็กให้แล้วก็จะตรวจได้ True
natang = QWidget()
print(natang.windowFlags()) # ได้ <PyQt5.QtCore.Qt.WindowFlags object at 0x7fa063a5b6d0>
print(bool(natang.windowFlags() & Qt.WindowStaysOnTopHint)) # ได้ False
natang.setWindowFlag(Qt.WindowStaysOnTopHint) # ตั้งแฟล็ก
print(bool(natang.windowFlags() & Qt.WindowStaysOnTopHint)) # ได้ True




การตั้งแฟล็กพร้อมกันทีเดียวหลายตัว {.setWindowFlags}

นอกจากเมธอด setWindowFlag แล้ว หากต้องการตั้งแฟล็กพร้อมกันทีละหลายตัวในทีเดียวก็ทำได้โดยใช้ setWindowFlags โดยใส่แฟล็กต่างๆลงไปโดยคั่นด้วย | โดยให้ใส่ natang.windowFlags() ลงไปด้วยเพื่อให้แฟล็กเดิมทีเคยตั้งอยู่นั้นไม่หายไปไหน

เช่นหากต้องการตั้งแฟล็ก Qt.Dialog พร้อมกับ Qt.WindowStaysOnTopHint ก็อาจเขียนได้แบบนี้
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtCore import Qt

qAp = QApplication(sys.argv)
natang = QWidget()
natang.setWindowFlags(natang.windowFlags() | Qt.Dialog | Qt.WindowStaysOnTopHint)
natang.show()
qAp.exec_()

นอกจากนี้แล้วยังสามารถเอาแฟล็กที่มีอยู่ออกได้โดยใช้ & ~ เช่น ถ้าจะเอา Qt.WindowStaysOnTopHint ออกก็อาจเขียนแบบนี้
natang.setWindowFlags(natang.windowFlags() & ~Qt.WindowStaysOnTopHint)

หรือหากต้องการเปลี่ยนสถานะแฟล็กที่ตั้งไว้ให้จากมีเป็นไม่มี จากไม่มีเป็นมี ก็ทำได้โดยใช้ ^
natang.setWindowFlags(natang.windowFlags() ^ Qt.WindowStaysOnTopHint)

ตัวอย่าง
natang = QWidget()
print(bool(natang.windowFlags() & Qt.WindowStaysOnTopHint)) # ได้ False
natang.setWindowFlags(natang.windowFlags() ^ Qt.WindowStaysOnTopHint)
print(bool(natang.windowFlags() & Qt.WindowStaysOnTopHint)) # ได้ True
natang.setWindowFlags(natang.windowFlags() & ~Qt.WindowStaysOnTopHint)
print(bool(natang.windowFlags() & Qt.WindowStaysOnTopHint)) # ได้ False
natang.setWindowFlags(natang.windowFlags() | Qt.WindowStaysOnTopHint)
print(bool(natang.windowFlags() & Qt.WindowStaysOnTopHint)) # ได้ True
natang.setWindowFlags(natang.windowFlags() ^ Qt.WindowStaysOnTopHint)
print(bool(natang.windowFlags() & Qt.WindowStaysOnTopHint)) # ได้ False




การตั้งสถานะหน้าต่าง {.setWindowState .windowState}

เมธอด .setWindowState ใช้สำหรับตั้งสถานะหน้าต่าง เช่น Qt.WindowMinimized คือถูกย่อซ่อน Qt.WindowMaximized ถูกขยายจนสุด Qt.WindowFullScreen คือตั้งเป็นเต็มจออยู่

ส่วนการตรวจดูสถานะทำได้โดยใช้ .windowState ซึ่งก็มีวิธีใช้เช่นเดียวกับ .windowFlags

ตัวอย่างเช่น ลองตั้งให้หน้าต่างย่อซ่อน
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtCore import Qt

qAp = QApplication(sys.argv)
natang = QWidget()
print(bool(natang.windowState() & Qt.WindowMinimized)) # ได้ False
natang.setWindowState(Qt.WindowMinimized) # ตั้งให้หน้าต่างย่อซ่อน
print(bool(natang.windowState() & Qt.WindowMinimized)) # ได้ True
natang.show()
qAp.exec_()

พอรันออกมาหน้าต่างก็จะเห็นว่าหน้าต่างกำลังถูกย่อซ่อนอยู่




สรุปท้ายบท

ในบทนี้ได้พูดถึงการปรับแต่งหน้าต่างเพิ่มเติมจากบทที่แล้ว ซึ่งก็สามารถเลือกปรับให้เป็นไปตามที่ต้องการเพื่อให้เหมาะกับการใช้งานได้

ในบทถัดไปจะเริ่มเข้าสู่เรื่องของการตั้งฟังก์ชันให้หน้าต่างและปุ่มต่างๆนั้นสามารถใช้งานจริง



อ่านบทถัดไป >> บทที่ ๔





-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> pyqt

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

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  查看日志

  推荐日志

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ