2014-10-17 4 views
0

PyQt4을 사용하여 GUI를 작성하기 시작했습니다. 이것은 GUI에 대한 나의 첫 번째 경험이다 (또한 oo-programming은 다소 새로운 것이다). 해당 GUI의 일부는 QComboBox의 4 ~ 5 인스턴스와 같습니다. 선택의 폭이 넓어지기 때문에 나중에 사용자가 비주류 적으로 변경되지 않도록 선택 항목을 잠글 수 있어야합니다.QCheckBox를 사용하여 PyQt4 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_choice 하드 코딩 단지를 잠 그려면이기 때문에, 그 디자인에 아주 불만이 하나 QComboBox 위해 나는 내가 쓴이 코드의 문제를 해결할 수 QComboBox combo_color의 선택. 내가 지금 다른 QComboBox에 대해 같은 일을 할 (combo_name를 말)와 클래스에 __init__(self) 코드 블록에 다음 코드를 추가하여 실현 될 수있는 두 번째 QCheckBox (checkbox_name 말) 경우 :

# 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 

모두 QComboBoxes을 지금 방법 use_choice()을 공유 할 수 있지만 두 가지 확인란이 모두 색상 선택을 고정하므로 lock_choice() 메서드를 공유 할 수 없습니다. 체크 박스 checkbox_name을 사용하여 현재 lock_choice() -method를 복사하여 붙여 넣거나 하드 코드 된 콤보 박스를 전환하지 않고 이름 선택을 잠그고 싶습니다. 나는 target-combobox를 메서드에 전달하는 것과 같은 쉬운 방법이 있다고 확신하는데, 아직 모르겠습니다. 도와 주시면 감사하겠습니다!

답변

1

가 연결 신호 부분 functions-

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()) 
+0

"귀하는 인수를 추가 할 수 있습니다"라는 부분을 설명해주십시오. 이것은 내가 찾고있는 것으로 보인다. – Nras

+0

Tanks, 너 무슨 뜻인지 안다. 그러나 현재 버전에서는 버그가 있습니다.''combos.isChecked() :''는 AttributeError : 'QComboBox'객체에 'isChecked'' 속성이 없습니다. 체크 박스는''isChecked()''에 대해서 체크된다. 올바른 체크 박스를 인수로 전달할 것을 제안 하시겠습니까? 아니면 다른 방법이 있습니까? QComboBox에 – Nras

+0

을 사용하는 경우 combos.isEnabled (True)를 사용할 수 있습니다.QCheckBox에 대한 – Ejaz

1

가장 간단한 해결책은 setDisabled 슬롯으로 toggled 신호를 사용하는 것입니다 :

self.checkbox_color.toggled.connect(self.combo_color.setDisabled) 

(그리고 신호 연결을 할 때 new-style sytax가 얼마나 청소기 주).

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

이 아마 더 편리 신호/슬롯 짝이없는 가장 관용적 솔루션입니다 (그리고 :

그것은 또한 당신이이 같은 인라인 신호 연결을위한 lambda을 사용할 수 있다는 지적 가치 물론 부분적인 기능은 다른 방식으로 어느 정도 동일한 것을 달성 할 수있다).

+0

정말 깨끗해 보입니다. 나중에 시도해 보겠습니다. – Nras