PyQt QCheckBox в Python — виджет флажка
- Знакомство с виджетом PyQt QCheckBox
- Сигнал stateChanged
- Программная установка отметки или снятия отметки для PyQt QCheckBox
- Создание трехпозиционного флажка
Знакомство с виджетом PyQt QCheckBox
Класс PyQt QCheckBox позволяет создать виджет флажка в Python, который можно включать и выключать. Чтобы создать флажок с помощью класса QCheckBox, выполните следующие действия:
- Сначала импортируйте класс QCheckBox:
from PyQt6.QtWidgets import QCheckBox
- Во-вторых, создайте новый экземпляр класса QCheckBox:
checkbox = QCheckBox(text)
Следующая программа показывает окно с флажком:
import sys from PyQt6.QtWidgets import QApplication, QWidget, QCheckBox, QGridLayout from PyQt6.QtCore import Qt class MainWindow(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('PyQt QCheckBox') self.setGeometry(100, 100, 320, 210) # create a grid layout layout = QGridLayout() self.setLayout(layout) # create a checkbox checkbox = QCheckBox('I agree', self) layout.addWidget(checkbox, 0, 0, Qt.AlignmentFlag.AlignCenter) # show the window self.show() if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Обратите внимание, что программа использует QGridLayout для размещения флажка в окне.
Вывод:
Сигнал stateChanged
Флажок подает сигнал stateChanged всякий раз, когда вы его отмечаете или снимаете.
Если вы хотите что-то сделать, когда флажок установлен или снят, вы можете подключить слот к сигналу stateChanged. Например:
checkbox = QCheckBox('I agree', self) checkbox.stateChanged.connect(self.on_checkbox_changed)
Сигнал stateChanged отправляет значение, указывающее, нажата кнопка или нет. Чтобы проверить состояние QCheckBox, вы создаете экземпляр Qt.CheckState:
state = Qt.CheckState(value)
И сравните его с одним из трех значений:
Состояние | Значение |
---|---|
Qt.CheckState.Checked | Отмечено |
Qt.CheckState.Unchecked | Не отмечено |
Qt.CheckState.PartiallyChecked | Частично отмечено |
Обратите внимание, что Qt.CheckState.PartiallyChecked используется для флажка с тремя состояниями, который будет рассмотрен ниже.
Например:
def on_checkbox_changed(self, value): state = Qt.CheckState(value) if state == Qt.CheckState.Checked: print('Checked') elif state == Qt.CheckState.Unchecked: print('Unchecked')
Также вы можете использовать метод isChecked(), чтобы проверить, отмечен ли флажок.
Ниже показана полная программа, которая выводит сообщение в консоль при установке или снятии флажка:
import sys from PyQt6.QtWidgets import QApplication, QWidget, QCheckBox, QGridLayout from PyQt6.QtCore import Qt class MainWindow(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('PyQt QCheckBox') self.setGeometry(100, 100, 320, 210) # create a grid layout layout = QGridLayout() self.setLayout(layout) # create a checkbox checkbox = QCheckBox('I agree', self) checkbox.stateChanged.connect(self.on_checkbox_changed) layout.addWidget(checkbox, 0, 0, Qt.AlignmentFlag.AlignCenter) # show the window self.show() def on_checkbox_changed(self, value): state = Qt.CheckState(value) if state == Qt.CheckState.Checked: print('Checked') elif state == Qt.CheckState.Unchecked: print('Unchecked') if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Программная установка отметки или снятия отметки для PyQt QCheckBox
Класс QCheckBox имеет метод setChecked(), который позволяет программно устанавливать или снимать отметку с флажка. Если вы передадите True в метод setChecked(), флажок будет установлен. Однако если вы передадите False в метод setCheck(), флажок будет снят.
Также вы можете использовать метод setCheckState() класса QCheckBox для установки состояния флажка. Метод setCheckState() принимает одно из трех значений состояния перечисления Qt.CheckState.
Следующая программа иллюстрирует, как использовать метод setChecked() для установки и снятия флажка:
import sys from PyQt6.QtWidgets import QApplication, QWidget, QCheckBox, QPushButton, QGridLayout from PyQt6.QtCore import Qt class MainWindow(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('PyQt QCheckBox') self.setGeometry(100, 100, 320, 210) # create a grid layout layout = QGridLayout() self.setLayout(layout) # create a checkbox self.checkbox = QCheckBox('I agree', self) check_button = QPushButton('Check', self) check_button.clicked.connect(self.check) uncheck_button = QPushButton('Uncheck', self) uncheck_button.clicked.connect(self.uncheck) layout.addWidget(self.checkbox, 0, 0, 0, 2, Qt.AlignmentFlag.AlignCenter) layout.addWidget(check_button, 1, 0) layout.addWidget(uncheck_button, 1, 1) # show the window self.show() def check(self): self.checkbox.setChecked(True) def uncheck(self): self.checkbox.setChecked(False) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Выход:
Как это работает.
- Сначала создайте флажок и добавьте его к атрибуту класса:
self.checkbox = QCheckBox('I agree', self)
Сделав флажок атрибутом класса, мы можем ссылаться на него в других методах того же класса.
- Во-вторых, создайте два виджета QPushButton и подключите каждый из них к методам check() и uncheck():
check_button = QPushButton('Check', self) check_button.clicked.connect(self.check) uncheck_button = QPushButton('Uncheck', self) uncheck_button.clicked.connect(self.uncheck)
- В-третьих, вызовите метод setChecked() со значением True, чтобы проверить флажок в методе check():
def check(self): self.checkbox.setChecked(True)
- Наконец, вызовите метод setChecked() со значением False, чтобы снять флажок в методе uncheck():
def uncheck(self): self.checkbox.setChecked(False)
Создание трехпозиционного флажка
Помимо отмеченного и неотмеченного, QCheckBox поддерживает третье состояние, которое указывает на «без изменений». В этом случае флажок имеет три состояния:
- Отмечено
- Не отмечено
- Частично отмечено
На практике флажок с тремя состояниями используется для того, чтобы предоставить пользователю возможность не устанавливать и не снимать флажок.
Чтобы создать флажок с тремя состояниями, используйте setTristate() со значением True:
checkbox.setTristate(True)
Следующая программа показывает флажок с тремя состояниями:
import sys from PyQt6.QtWidgets import QApplication, QWidget, QCheckBox, QGridLayout from PyQt6.QtCore import Qt class MainWindow(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('PyQt QCheckBox') self.setGeometry(100, 100, 320, 210) # create a grid layout layout = QGridLayout() self.setLayout(layout) # create a tristate checkbox self.checkbox = QCheckBox('A Tristate Checkbox', self) self.checkbox.setTristate(True) layout.addWidget(self.checkbox, 0, 0, Qt.AlignmentFlag.AlignCenter) # show the window self.show() if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())
Выход: