PyQt QCheckBox в Python — виджет флажка

Содержание

Знакомство с виджетом 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())

Выход:

Метод setChecked() для установки и снятия флажка

Как это работает.

  • Сначала создайте флажок и добавьте его к атрибуту класса:
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())

Выход:

Флажок с тремя состояниями

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *