ต่อจาก
บทที่ ๑๑
บทนี้จะพูดถึง QComboBox ซึ่งเป็นกล่องที่มีข้อความเป็นตัวเลือกให้เลือกข้อความใดข้อความหนึ่ง
QComboBox มีไว้ใช้สำหรับเลือกอย่างใดอย่างหนึ่ง เช่นเดียวกับ QRadioButton ที่แนะนำไปในบทที่แล้ว แต่วิธีการสร้างและใช้งานดูจะเรียบง่ายว่า
การสร้างกล่องเลือกข้อความ {QComboBox}
การใช้งาน QComboBox นั้นเริ่มจากสร้างออบเจ็กต์ตัว QComboBox ขึ้นมาแล้วใช้เมธอด .addItem เพื่อใส่ข้อความตัวเลือกทั้งหมดที่ต้องการลงไป
ตัวอย่าง
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QLabel,QComboBox,QHBoxLayout
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; color: #914; font-size: 18px;')
hbl = QHBoxLayout()
natang.setLayout(hbl)
khokhwam = QLabel('อยู่ภาค')
hbl.addWidget(khokhwam)
combo = QComboBox()
combo.addItem('เหนือ')
combo.addItem('กลาง')
combo.addItem('อีสาน')
combo.addItem('ใต้')
# หรือ combo.addItems(['เหนือ','กลาง','อีสาน','ใต้'])
hbl.addWidget(combo)
natang.show()
qAp.exec_()
การตั้งให้เลือกตัวเลือก {.setCurrentIndex .setCurrentText}
ปกติโดยเริ่มต้น กล่องเลือกข้อความจะถูกตั้งให้เลือกที่ตัวเลือกแรกอยู่ แต่ก็สามารถตั้งให้เป็นตัวอื่นได้โดยใช้เมธอด .setCurrentIndex โดยระบุลำดับของตัวเลือกที่ต้องการ (เริ่มจาก 0) หรือใช้ .setCurrentText โดยระบุข้อความที่ต้องการให้เลือก
แต่หากต้องการให้ยกเลิกตัวเลือกทั้งหมดก็ให้ใส่ .setCurrentIndex แล้วใส่เป็นค่าที่ไม่มีอยู่ก็จะเป็นการไม่เลือกตัวไหนเลย
ตัวอย่าง ลองสร้างกล่องเลือกข้อความมา พร้อมกับปุ่มที่เมื่อกดแล้วยกเลิกตัวเลือก
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QComboBox,QHBoxLayout,QPushButton
qAp = QApplication(sys.argv)
natang = QWidget()
hbl = QHBoxLayout()
natang.setLayout(hbl)
def lueak(): # เมื่อกดปุ่มแล้วให้ยกเลิกการเลือกในกล่อง
combo.setCurrentIndex(-1)
pumkot = QPushButton('o_O"')
hbl.addWidget(pumkot)
pumkot.clicked.connect(lueak)
combo = QComboBox() # กล่องเลือกข้อความ
combo.addItems(['alpha','beta','gamma']) # ใส่ข้อความไป ๓ ตัว
hbl.addWidget(combo)
natang.show()
qAp.exec_()
ขอยกอีกตัวอย่างคือกรณีที่ใช้ .setCurrentText ซึ่งจะกำหนดด้วยสายอักขระที่ต้องการเลือก แทนที่จะใช้เลขลำดับเหมือนอย่าง .setCurrentIndex
นอกจากนี้ ถ้าหากสายอักขระที่ใส่ไปนั้นไม่มีอยู่ในตัวเลือก ก็จะไม่เกิดอะไรขึ้น
ตัวอย่าง ลองสร้างปุ่มที่กดแล้วให้มีการเลือก
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QComboBox,QHBoxLayout,QVBoxLayout,QPushButton
qAp = QApplication(sys.argv)
natang = QWidget()
hbl = QHBoxLayout()
natang.setLayout(hbl)
combo = QComboBox()
combo.addItem('muramura')
combo.addItem('iraira')
combo.addItem('sarasara')
hbl.addWidget(combo)
combo.setCurrentText('iraira')
vbl = QVBoxLayout()
hbl.addLayout(vbl)
pumkot = QPushButton('') # ปุ่มนี้กดแล้วยกเลิกการเลือก
pumkot.clicked.connect(lambda: combo.setCurrentIndex(-1))
vbl.addWidget(pumkot)
pumkot = QPushButton('mm')
pumkot.clicked.connect(lambda: combo.setCurrentText('muramura'))
vbl.addWidget(pumkot)
pumkot = QPushButton('ff') # ปุ่มนี้ไม่มีในตัวเลือก กดแล้วจะไม่เกิดอะไรขึ้น
pumkot.clicked.connect(lambda: combo.setCurrentText('furafura'))
vbl.addWidget(pumkot)
pumkot = QPushButton('ii')
pumkot.clicked.connect(lambda: combo.setCurrentText('iraira'))
vbl.addWidget(pumkot)
pumkot = QPushButton('ss')
pumkot.clicked.connect(lambda: combo.setCurrentText('sarasara'))
vbl.addWidget(pumkot)
natang.show()
qAp.exec_()
ก็จะได้ปุ่ม ๕ ปุ่มแบบนี้ ซึ่งถ้ากดปุ่มไหนก็จะเป็นการเลือกตัวเลือกนั้น แต่ในที่นี้ในช่องตัวเลือกมีแค่ ๓ ตัว ถ้ากดปุ่ม 'ff' ซึ่งใช้ .setCurrentText เป็นคำว่า furafura ซึ่งไม่มีตัวเลือกก็จะไม่เกิดอะไรขึ้น
อย่างไรก็ตาม ถ้าหากกล่องข้อความนี้ตั้งให้สามารถแก้ข้อความเอาเองได้ โดยใช้ .setEditable ดังที่จะกล่าวถึงต่อไป แบบนี้ .setCurrentText ก็จะแก้เป็นข้อความที่ต้องการไม่ว่าจะมีในตัวเลือกก็ตาม
การตั้งให้แก้ข้อความในกล่องได้ด้วย {.setEditable}
ปกติแล้วข้อความที่เป็นตัวเลือกในกลุ่มจะเลือกได้แค่ข้อความที่อยู่ในตัวเลือกเท่านั้น แต่ก็สามารถทำให้พิมพ์ข้อความเพิ่มไปเองนอกจากตัวเลือกได้ โดยใช้เมธอด .setEditable ตั้งเป็น True
ตัวอย่างเช่น
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QComboBox,QLabel,QVBoxLayout,QPushButton
qAp = QApplication(sys.argv)
natang = QWidget()
natang.setStyleSheet('font-family: Tahoma; font-size: 17px;')
vbl = QVBoxLayout()
natang.setLayout(vbl)
khokhwam = QLabel('จะเบิกเงินเท่าไหร่')
vbl.addWidget(khokhwam)
combo = QComboBox()
vbl.addWidget(combo)
for ngoen in [0,100,500,1000,5000]:
combo.addItem('%d'%ngoen)
combo.setCurrentText('0')
combo.setEditable(True)
natang.show()
qAp.exec_()
แบบนี้จะมีตัวเลือกให้เลือก ๕ ตัว แต่จะป้อนอะไรอย่างอื่นไปเองก็ได้
การดูว่าเลือกตัวไหนอยู่ {.currentIndex .currentText}
ถ้าจะดูว่ากล่องเลือกนั้นถูกเลือกตัวไหนอยู่ก็ใช้เมธอด .currentIndex จะได้เลขลำดับ (เริ่มนับจาก 0)
ส่วนถ้าจะเอาข้อความที่ถูกเลือกอยู่ก็ใช้เมธอด .currentText
ตัวอย่าง ลองสร้างกล่องข้อความแล้ววางปุ่มไว้ข้างๆให้ถ้ากดปุ่มนั้นข้อความและลำดับที่เลือกจะปรากฏที่ตัวปุ่ม
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QComboBox,QHBoxLayout
qAp = QApplication(sys.argv)
natang = QWidget()
hbl = QHBoxLayout()
natang.setLayout(hbl)
combo = QComboBox()
hbl.addWidget(combo)
for i in range(8):
combo.addItem(str((i+3)*4)+' คน')
pumkot = QPushButton('')
hbl.addWidget(pumkot)
pumkot.setFixedSize(240,45)
pumkot.setStyleSheet('font-family: Tahoma; font-size: 16px;')
def saikhokhwam():
pumkot.setText('ลำดับที่: %d | ข้อความ: %s'%(combo.currentIndex(),combo.currentText()))
pumkot.clicked.connect(saikhokhwam)
natang.show()
qAp.exec_()
การทำคำสั่งเมื่อถูกกดเลือก {.activated}
ถ้ามีคำสั่งที่ต้องการให้ทำเมื่อมีการกดเลือกตัวเลือกภายในกล่องตัวเลือกก็ให้ใส่ที่ .activated ค่าพารามิเตอร์ที่ได้มาคือเลขลำดับที่ถูกเลือกอยู่นั้น
ตัวอย่างเช่น
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QComboBox
qAp = QApplication(sys.argv)
natang = QWidget()
combo = QComboBox(natang)
def lueaklaeo(i):
print('เลือกข้อความ %s ลำดับที่ %d'%(combo.currentText(),i))
combo.activated.connect(lueaklaeo)
combo.addItems(['kujira','ika','iruka','kurage'])
natang.show()
qAp.exec_()
การทำคำสั่งเมื่อเปลี่ยนตัวเลือก {.currentIndexChanged .currentTextChanged}
ฟังก์ชันที่กำหนดที่ .activated นั้นจะทำงานทุกครั้งที่มีการกดเลือกตัวเลือก ไม่ว่าตัวเลือกจะถูกเปลี่ยนหรือไม่ แต่ถ้าหากต้องการให้ทำงานเฉพาะเมื่อตัวเลือกเปลี่ยนแปลงก็อาจใช้ .currentIndexChanged แทน
ค่าพารามิเตอร์ที่ได้ใน .currentIndexChanged ก็คือลำดับที่ถูกเลือก
นอกจากนี้ยังมี .currentTextChanged ซึ่งคล้ายกับ .currentIndexChanged แต่พารามิเตอร์ที่ได้จะเป็นข้อความที่ถูกเลือก และนอกจากนี้แล้วถ้าตั้ง .setEditable(True) แล้ว .currentTextChanged ก็จะทำงานเมื่อแก้ข้อความในกล่องไปโดยตรงด้วย
ตัวอย่าง
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QLabel,QComboBox,QHBoxLayout
qAp = QApplication(sys.argv)
natang = QWidget()
hbl = QHBoxLayout()
natang.setLayout(hbl)
khokhwam = QLabel('')
hbl.addWidget(khokhwam)
def lueak(text):
khokhwam.setText('ขอ '+text+' ชาม')
combo = QComboBox()
hbl.addWidget(combo)
for i in range(9):
combo.addItem(str((i+4)*3))
combo.currentTextChanged.connect(lueak)
natang.show()
qAp.exec_()
สรุปท้ายบท
ในบทนี้ได้เขียนถึงการสร้างและใช้งานกล่องเลือกข้อความ ซึ่งสามารถใช้ทั้งเลือกตัวเลือกที่อยู่ในกล่อง หรือสามารถพิมพ์ข้อความอื่นที่ต้องการไปเองได้ด้วย
ทั้ง QLineEdit และ QComboBox ต่างก็ใช้เพื่อเลือกหรือป้อนข้อความสายอักขระเหมือนกัน ส่วนในบทต่อไปจะพูดถึง widget ที่ใช้สำหรับป้อนข้อมูลเป็นค่าตัวเลข
อ่านบทถัดไป >>
บทที่ ๑๓