Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用QCheckBox锁定PyQt4 QComboBox中的选项_Python_User Interface_Pyqt4_Qcombobox_Qcheckbox - Fatal编程技术网

Python 使用QCheckBox锁定PyQt4 QComboBox中的选项

Python 使用QCheckBox锁定PyQt4 QComboBox中的选项,python,user-interface,pyqt4,qcombobox,qcheckbox,Python,User Interface,Pyqt4,Qcombobox,Qcheckbox,我开始使用PyQt4编写GUI。这是我第一次使用GUI(而且oo编程对我来说有些陌生)。该GUI的一部分类似于QComboBox的4到5个实例。由于要做出许多选择,我希望用户能够锁定一个选择,这样以后就不会无意中更改。对于一个QComboBox,我可以用我编写的代码解决这个问题: import sys from PyQt4 import QtGui, QtCore class MyGui(QtGui.QWidget): def __init__(self): QtGui

我开始使用
PyQt4
编写GUI。这是我第一次使用GUI(而且oo编程对我来说有些陌生)。该GUI的一部分类似于
QComboBox
的4到5个实例。由于要做出许多选择,我希望用户能够锁定一个选择,这样以后就不会无意中更改。对于一个QComboBox,我可以用我编写的代码解决这个问题:

import sys
from PyQt4 import QtGui, QtCore

class MyGui(QtGui.QWidget):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.resize(250, 50)

        # vertical layout for widgets
        self.vbox = QtGui.QVBoxLayout()
        self.setLayout(self.vbox)

        # Create a combo box with some choices
        self.combo_color = QtGui.QComboBox()
        self.vbox.addWidget(self.combo_color)
        items = 'Red Yellow Purple'.split()
        self.combo_color.addItems(items)
        self.connect(self.combo_color, QtCore.SIGNAL('activated(QString)'), self.use_choice)

        # add a checkbox next to the combobox which (un-)locks the the combo-choice
        self.checkbox_color = QtGui.QCheckBox('Lock Choice', self)
        self.vbox.addWidget(self.checkbox_color)
        self.connect(self.checkbox_color, QtCore.SIGNAL('stateChanged(int)'), self.lock_choice)

    def use_choice(self, text):
        # do something very useful with the choice
        print 'The current choice is: {choice}'.format(choice=text)

    def lock_choice(self):
        if self.checkbox_color.isChecked():
            self.combo_color.setEnabled(False)
            print 'Choice {choice} locked'.format(choice=self.combo_color.currentText())
        else:
            self.combo_color.setEnabled(True)
            print 'Choice unlocked'


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    mygui = MyGui()
    mygui.show()
    app.exec_()
这个代码做了它应该做的,但是我对它的设计非常不满意,因为方法
lock\u choice
是硬编码的,只锁定QComboBox
combo\u color
的选择。如果我现在想对另一个QComboBox(比如说
combo\u name
)和第二个QCheckBox(比如说
checkbox\u name
)执行相同的操作,可以通过将以下代码附加到类
\u init\u(self)
代码块来实现:

    # create second combo box with some other choices
    self.combo_name = QtGui.QComboBox()
    self.vbox.addWidget(self.combo_name)
    items = 'Bob Peter'.split()
    self.combo_name.addItems(items)
    self.connect(self.combo_name, QtCore.SIGNAL('activated(QString)'), self.use_choice)

    # add a checkbox next to the combobox which (un-)locks the the combo-choice
    self.checkbox_name = QtGui.QCheckBox('Lock Choice', self)
    self.vbox.addWidget(self.checkbox_name)
    self.connect(self.checkbox_name, QtCore.SIGNAL('stateChanged(int)'), self.lock_choice) # <-- obviously wrong, as it (un-)locks color choice at the moment
#使用其他选项创建第二个组合框
self.combo_name=QtGui.QComboBox()
self.vbox.addWidget(self.combo\u名称)
items='Bob Peter'.split()
self.combo\u name.addItems(项目)
self.connect(self.combo_名称、QtCore.SIGNAL('activated(QString)')、self.use_选项)
#在组合框旁边添加一个复选框,该复选框(取消)锁定组合选项
self.checkbox_name=QtGui.QCheckBox('Lock Choice',self)
self.vbox.addWidget(self.checkbox\u名称)
self.connect(self.checkbox_name,QtCore.SIGNAL('stateChanged(int)),self.lock_choice)35;尝试部分函数-

from functools import partial
使用连接信号,传递QWidget名称:

self.connect(self.checkbox_color, QtCore.SIGNAL('stateChanged(int)'), partial(self.lock_choice, self.combo_color))
在方法中,可以添加一个参数

我们将在下面的方法中添加一个参数,以处理我们将通过上面的分部函数传递的QWidget(QComboBox)

def lock_choice(self, combos):
    if combos.isEnabled(True):
        combos.setEnabled(False)
        print 'Choice {choice} locked'.format(choice=combos.currentText())

最简单的解决方案是将信号与插槽一起使用:

(并注意进行信号连接时的清洁度)

还值得指出的是,您还可以使用
lambda
进行内联信号连接,如下所示:

    self.checkbox_color.toggled.connect(
        lambda checked: self.combo_color.setDisabled(checked))

这可能是在没有方便的信号/插槽配对时最惯用的解决方案(当然,部分函数可以以不同的方式实现或多或少的相同功能)。

请您通过解释“您可以添加参数”部分来扩展您的答案,好吗?这似乎就是我要找的。我明白你的意思。但是,当前版本有一个bug,因为行
if combos.isChecked():
引发了
AttributeError:'QComboBox'对象没有属性“isChecked”
,这是有意义的,因为它应该是复选框,它被选中用于
isChecked()
。您是否建议将正确的复选框也作为参数传递,还是有其他方法?对于QComboBox,您可以使用if combos.isEnabled(True)。对于QCheckBox,您也可以使用部分函数传递它,与我们对QComboBox所做的相同。两种方法都可以。它与:
self.connect(self.checkbox\u name,QtCore.SIGNAL('stateChanged(int)')、partial(self.lock\u choice,self.combo\u name,self.checkbox\u name,self.checkbox\u name))
和lock\u choice方法:
def lock\u choice(self,combos,checkbox):
后跟:
if checkbox.isChecked()。在这里学到了一些东西。谢谢,+1。那看起来真的很干净,我以后会试试的。
    self.checkbox_color.toggled.connect(
        lambda checked: self.combo_color.setDisabled(checked))