Python2 PyQt4将bool变量连接到QCheckBox项

2024-09-26 18:05:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我对QCheckBox有问题。在

我试图将一个布尔变量连接到一个QCheckBox,这样当我更改boolean变量时,QCheckBox将自动被选中或取消选中。

下面的问题和我的问题是相反的。在

question: Python3 PyQt4 Creating a simple QCheckBox and changing a Boolean variable

我只是把这个问题的答案复制到这里。在

import sys

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class SelectionWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.ILCheck = False

        ILCheckbox = QCheckBox(self)
        ILCheckbox.setCheckState(Qt.Unchecked)

        ILCheckbox.stateChanged.connect(self.ILCheckbox_changed)

        MainLayout = QGridLayout()
        MainLayout.addWidget(ILCheckbox, 0, 0, 1, 1)

        self.setLayout(MainLayout)

    def ILCheckbox_changed(self, state):
        self.ILCheck = (state == Qt.Checked)

        print(self.ILCheck)


if __name__ == '__main__':
  app = QApplication(sys.argv)
  window = SelectionWindow()

  window.show()
  window.ILCheck = True
  sys.exit(app.exec_())

在本例中,一旦将ILCheck设置为True,就会检查QCheckBox。在

任何帮助都将不胜感激!!!在

谢谢!!!!在


更新:

我在我的项目中使用MVC,上面的代码只是一个例子,说明了我需要什么。bool值ILCheck将在其他地方使用,我不希望在我的模型中调用ILCheckBox。在

我希望如果我修改ILCheck的值,ILCheckBox将正确反应。在


更新:

谢谢你的回复和帮助。你的解决方案太好了!!!我需要的方式更像是一个建模视图解决方案,这样我就可以将建模部分和gui部分分开。当我想更新一些东西时,我只需要更新建模,而不需要关注gui是什么样子的。我无法在视图类中设置此布尔属性,因此无法使用此解决方案。在

我不确定MVC是否适合PyQT。我有一个类似下面这样的解决问题的方法。在

^{pr2}$

这个解决方案带来了一个问题,我无法解决。我认为只有一个观点才能树立一个典范。我不确定是否可以将模型设置为单个QCheckBox。 . 在


Tags: fromimportselfinitdefsys解决方案window
3条回答

只需在调用ILCheck后使用ILCheckbox.setCheckState(Qt.Checked)。在

你不需要这里的信号,因为你可以准确地呼叫一个插槽。在

如果您想多次使用这个特性,您应该考虑编写一个setter来改变self.ILCheck的状态并发出一个信号。在

澄清后编辑:

正如Avaris在他/她的答案中所示,模拟操作符=的重载是解决问题的一个好的开始。但是代码的问题仍然是 添加到SelectionWindow类。在

但是由于我们使用的是Qt,所以让我们实现一个定制的QObject,它表示我们的“智能”布尔变量,当 更改其值。在

class SmartBool(QObject):

    valueChanged = pyqtSignal(bool)         # Signal to be emitted when value changes.

    def __init__(self):
        super(SmartBool, self).__init__()   # Call QObject contructor.
        self.__value = False                # False initialized by default.

    @property
    def value(self):
        return self.__value

    @value.setter
    def value(self, value):
        if self.__value != value:
            self.valueChanged.emit(value)   # If value change emit signal.
            self.__value = value

现在,您的代码只需要做几处更改:

更换管路:

^{pr2}$

签署人:

self.ILCheck = SmartBool()

把信号和插槽连接起来,把这条线加到上面那条线后面的某个地方。{在类中建立连接并不重要

self.connect(self.ILCheck, SIGNAL("valueChanged(bool)"), ILCheckbox, SLOT("setChecked(bool)"))

对于测试结果,只需添加:

 window.ILCheck.value = True

在您的“main”中,您将在下次运行示例时看到选中的复选框。在

由于严格的原因,将完整的代码示例添加到末尾

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class SmartBool(QObject):

    valueChanged = pyqtSignal(bool)         # Signal to be emitted when value changes.

    def __init__(self, value=False):
        super(SmartBool, self).__init__()   # Call QObject contructor.
        self.__value = value                # False initialized by default.

    @property
    def value(self):
        return self.__value

    @value.setter
    def value(self, value):
        if self.__value != value:
            self.valueChanged.emit(value)   # If value change emit signal.
            self.__value = value


class SelectionWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ILCheck = SmartBool()          # Your steroides bool variable.
        ILCheckbox = QCheckBox(self)
        self.connect(self.ILCheck, SIGNAL("valueChanged(bool)"), ILCheckbox, SLOT("setChecked(bool)"))
        ILCheckbox.setCheckState(Qt.Unchecked)
        ILCheckbox.stateChanged.connect(self.ILCheckbox_changed)
        MainLayout = QGridLayout()
        MainLayout.addWidget(ILCheckbox, 0, 0, 1, 1)
        self.setLayout(MainLayout)

    def ILCheckbox_changed(self, state):
        self.ILCheck = (state == Qt.Checked)
        print(self.ILCheck)


if __name__ == '__main__':
  app = QApplication(sys.argv)
  window = SelectionWindow()
  window.show()
  window.ILCheck.value = True
  sys.exit(app.exec_())

^{}是定义一个变量的方法,该变量在赋值/访问时执行额外的工作。下面是为此修改的代码。它将ILCheck更改为一个属性,这样它在赋值时也会更新复选框。没有对.setter进行正确的错误检查,但很可能需要这样做。在

import sys

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class SelectionWindow(QWidget):
    def __init__(self, parent=None):
        super(SelectionWindow, self).__init__(parent)

        self._ILCheck = False

        self.ILCheckbox = QCheckBox(self)
        self.ILCheckbox.setCheckState(Qt.Unchecked)

        self.ILCheckbox.stateChanged.connect(self.ILCheckbox_changed)

        MainLayout = QGridLayout()
        MainLayout.addWidget(self.ILCheckbox, 0, 0, 1, 1)

        self.setLayout(MainLayout)

    def ILCheckbox_changed(self, state):
        self._ILCheck = (state == Qt.Checked)

        print(self.ILCheck)

    @property
    def ILCheck(self):
        return self._ILCheck

    @ILCheck.setter
    def ILCheck(self, value):
        self._ILCheck = value
        self.ILCheckbox.setChecked(value)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = SelectionWindow()

    window.show()
    window.ILCheck = True
    sys.exit(app.exec_())

相关问题 更多 >

    热门问题