#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. Я еще не видел предыдущий, когда набирал его. Не видел необходимости его стирать. Спасибо