Почему я не могу установить для tristate QCheckBox значение Qt.PartiallyChecked и чтобы QCheckBox отображал частичную проверку?

#python #python-3.x #pyqt5 #qcheckbox

#python #python-3.x #pyqt5 #qcheckbox

Вопрос:

Я использую python3 и PyQt5.

В приведенном ниже примере есть три QPushButtons и QCheckBox с значением true для параметра tristate . Я могу щелкнуть непосредственно по флажку, и он будет проходить через три состояния просто отлично.

ПРОБЛЕМА: если я попытаюсь установить значение состояния с помощью соседних кнопок, это только даст мне checked или unchecked . Это сводит с ума.

 #!/usr/bin/env python3


from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout(self)
        
        
        qb1=QPushButton("Uncheck it")
        qb2=QPushButton("Partial Check it")
        qb3=QPushButton("Check it reals")
        qb1.clicked.connect(self.uncheck_it) 
        qb2.clicked.connect(self.partial_check_it) 
        qb3.clicked.connect(self.check_it) 
        
        
        
        self.qch=QCheckBox("Chonk") 
        self.qch.stateChanged.connect(self.chonker) 
        self.qch.setTristate(True) 


        hbox.addWidget(self.qch)
        hbox.addWidget(qb1)
        hbox.addWidget(qb2)
        hbox.addWidget(qb3)
        self.setLayout(hbox)

        self.move(300, 200)
        self.setWindowTitle('Choooo')
        self.show()

    def chonker(self):
        print("chonker", self.sender().text(),self.sender().isChecked())
        
    def uncheck_it(self):
        self.qch.setChecked(Qt.Unchecked)
        print ("Uncheck it")
    def partial_check_it(self):
        self.qch.setChecked(Qt.PartiallyChecked)
        print ("Partial check it")
    def check_it(self):
        self.qch.setChecked(Qt.Checked)
        print ("Check it")


    

def main():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

  

Ответ №1:

setChecked() Метод изменяется только на 2 состояния: проверено или снято. Если вы хотите перейти ко всем 3 состояниям, вы должны использовать setCheckState() метод:

 def uncheck_it(self):
    self.qch.setCheckState(Qt.Unchecked)
    print("Uncheck it")

def partial_check_it(self):
    self.qch.setCheckState(Qt.PartiallyChecked)
    print("Partial check it")

def check_it(self):
    self.qch.setCheckState(Qt.Checked)
    print("Check it")  

Ответ №2:

Спасибо пользователю eyllanesc!

В приведенном ниже коде используются альтернативные функции, которые являются правильными для флажка с тремя состояниями.

заменил функцию setChecked на функцию setCheckState . замененная функция проверяется функцией CheckState, которая фактически возвращает значение tristate .

Это работает!

 #!/usr/bin/env python3


from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout(self)
        
        
        qb1=QPushButton("Uncheck it")
        qb2=QPushButton("Partial Check it")
        qb3=QPushButton("Check it reals")
        qb1.clicked.connect(self.uncheck_it) 
        qb2.clicked.connect(self.partial_check_it) 
        qb3.clicked.connect(self.check_it) 
        
        
        
        self.qch=QCheckBox("Chonk") 
        self.qch.stateChanged.connect(self.chonker) 
        self.qch.setTristate(True) 


        hbox.addWidget(self.qch)
        hbox.addWidget(qb1)
        hbox.addWidget(qb2)
        hbox.addWidget(qb3)
        self.setLayout(hbox)

        self.move(300, 200)
        self.setWindowTitle('Choooo')
        self.show()

    def chonker(self):
        print("chonker", self.sender().text(),self.sender().checkState())
        
    def uncheck_it(self):
        self.qch.setCheckState(Qt.Unchecked)
        print ("Uncheck it")
    def partial_check_it(self):
        self.qch.setCheckState(Qt.PartiallyChecked)
        print ("Partial check it")
    def check_it(self):
        self.qch.setCheckState(Qt.Checked)
        print ("Check it")


    

def main():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
  

Комментарии:

1. Я не понимаю, зачем публиковать второй «ответ», который уже охватывал мой ответ. Я бы понял новый ответ, если он дает другой вариант или указывает, что некоторые из других ответов имеют недостатки. Может быть, я ошибаюсь, не могли бы вы объяснить? Какие преимущества ваш ответ приносит сайту?

2. Я еще не видел предыдущий, когда набирал его. Не видел необходимости его стирать. Спасибо