ต่อจาก
บทที่ ๒
ในบทที่แล้วได้พูดถึงเรื่องการจัดวาง 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_()
พอรันออกมาหน้าต่างก็จะเห็นว่าหน้าต่างกำลังถูกย่อซ่อนอยู่
สรุปท้ายบท
ในบทนี้ได้พูดถึงการปรับแต่งหน้าต่างเพิ่มเติมจากบทที่แล้ว ซึ่งก็สามารถเลือกปรับให้เป็นไปตามที่ต้องการเพื่อให้เหมาะกับการใช้งานได้
ในบทถัดไปจะเริ่มเข้าสู่เรื่องของการตั้งฟังก์ชันให้หน้าต่างและปุ่มต่างๆนั้นสามารถใช้งานจริง
อ่านบทถัดไป >>
บทที่ ๔