Python - PyQt5, как обрабатывать флажки GUI как отдельный объект? - PullRequest
0 голосов
/ 22 октября 2018

Я довольно новичок в изучении Qt и в случае Qt для Python;У меня проблема с флажком PyQt5.В следующем коде, когда я проверяю флажок, я получаю сигнал, перенаправленный на подключенную функцию.Он справедливо обнаруживается, если флажок установлен или не отмечен, однако, похоже, мой сценарий делает путаницу, среди которых окно изменило состояние.Например, если я проверяю первый, то все проверки, которые я выполняю, после первого показывают значение имени, связанное с самым ранним объектом, например, если они все были на самом деле одним и тем же объектом или имеют один и тот же адрес.Вместо этого, если я установлю и сниму флажок, следующий отмеченный возвращает правильное имя, связанное с этим конкретным флажком в выводе.Что я делаю не так?

Вот код класса:

class window_gui(QMainWindow):
def __init__(self):
    QtWidgets.QMainWindow.__init__(self)
    mainWindow = loadUi("utilities/mygui_gui.ui", self)
    self.setWindowTitle("window name")
    #checkBox per selezione uno: sensore sul checked yes or not
    mainWindow.checkOne.clicked.connect(self.selectBooks)
    # checkBox per selezione due: sensore sul checked yes or not
    mainWindow.checkTwo.toggled.connect(self.selectBooks)
    # checkBox per selezione tre: sensore sul checked yes or not
    mainWindow.checkThree.toggled.connect(self.selectBooks)
    # checkBox per selezione quattro: sensore sul checked yes or not
    mainWindow.checkFour.toggled.connect(self.selectBooks)
    # checkBox per selezione cinque: sensore sul checked yes or not
    mainWindow.checkFive.toggled.connect(self.selectBooks)

def selectBooks(self, toggle):
    if toggle == QtCore.Qt.Checked:
        if self.checkOne.isChecked():
            print(self.checkOne.text(), "1")
        elif self.checkTwo.isChecked():
            print(self.checkTwo.text(), "2")
        elif self.checkThree.isChecked():
            print(self.checkThree.text(), "3")
        elif self.checkFour.isChecked():
            print(self.checkFour.text(), "4")
        elif self.checkFive.isChecked():
            print(self.checkFive.text(), "5")
        else:
            print("error")
        print('Checked')
    else:
        print('Unchecked')

1 Ответ

0 голосов
/ 22 октября 2018

Когда отмечен checkOne и вы нажимаете checkTwo, вы вводите selectBooks.В этой функции вы вводите if-else -статист, и первое условие - self.checkOne.isChecked(), которое все еще True, поэтому вы print(self.checkOne.text(), "1"), хотя вы только что нажали checkTwo.

Вы можете сделатьслот для каждого QCheckBox (вариант 1), в противном случае вам нужно как-то сообщить своему слоту, какой QCheckbox был только что нажат (см. вариант 2).

Также необходимо использовать сигнал stateChanged.

опция 1

from PyQt5 import QtWidgets, QtCore, QtGui
import sys

class window_gui(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.checkOne = QtWidgets.QCheckBox('one')
        self.checkTwo = QtWidgets.QCheckBox('two')
        self.vlayout = QtWidgets.QVBoxLayout()
        self.vlayout.addWidget(self.checkOne)
        self.vlayout.addWidget(self.checkTwo)
        self.setLayout(self.vlayout)
        self.checkOne.stateChanged.connect(self.selectBooks1)
        self.checkTwo.stateChanged.connect(self.selectBooks2)

    def selectBooks1(self, toggle):
        if toggle == QtCore.Qt.Checked:
            print('checked 1')
        else:
            print('unchecked 1')

    def selectBooks2(self, toggle):
        if toggle == QtCore.Qt.Checked:
            print('checked 2')
        else:
            print('unchecked 2')

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = window_gui()
    w.show()
    app.exec()

опция 2 ( проверить выражения «лямбда» ):

from PyQt5 import QtWidgets, QtCore, QtGui
import sys

class window_gui(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.checkOne = QtWidgets.QCheckBox('one')
        self.checkTwo = QtWidgets.QCheckBox('two')
        self.vlayout = QtWidgets.QVBoxLayout()
        self.vlayout.addWidget(self.checkOne)
        self.vlayout.addWidget(self.checkTwo)
        self.setLayout(self.vlayout)
        self.checkOne.stateChanged.connect(lambda state=self.checkOne.isChecked(), no=1: self.selectBooks(state, no))
        self.checkTwo.stateChanged.connect(lambda state=self.checkTwo.isChecked(), no=2: self.selectBooks(state, no))

    def selectBooks(self, toggle, no):
        if toggle == QtCore.Qt.Checked:
            print('checked '+str(no))
        else:
            print('unchecked '+str(no))

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = window_gui()
    w.show()
    app.exec()
...