2017-11-11 27 views
0

사용자가 새 항목을 선택하면 QComboBox currentIndexChanged 신호가 발생하지 않습니다. 하지만 .setCurrentIndex가 코드 내에서 사용되면 실행되지 않습니다. (라인 91 및 92).Pyqt4 사용자 입력시 Qcombobox 신호가 실행되지 않지만 .setCurrentIndex를 사용하면 완료됩니다.

나는 QTabWidget을 가지고 있습니다. tab1에는 3 개의 Qhbox가 추가 된 Qvbox가 있습니다. 각 Qhbox는 Kaskade 클래스의 클래스이며 두 개의 위젯 인 QCombobox와 QstackedWidget을 포함합니다. QCombobox의 현재 색인에 따라 QstackWidget은 QLCD 번호 또는 Qspinbox를 표시합니다. 사용자가 GUI에서 QCombobox 색인을 변경하면 QCombobox가 새 항목을 표시하지만 currentIndexChanged 신호는 방출되지 않습니다.

무엇이 누락 되었습니까? 모든 종류의 도움을 주시면 감사하겠습니다.

이 당신은 표 1,하지 레이아웃에 vboxKaskade를 추가해야합니다 내 테스트 코드

# -*- coding: utf-8 -*- 

from PyQt4 import QtCore, QtGui 

import sys 



class Kaskade(QtGui.QWidget): 
    def __init__(self,sp,sp_min,sp_max, parent = None): 
     super(Kaskade, self).__init__(parent) 


     self._sp=sp 
     self._sp_min=sp_min 
     self._sp_max=sp_max 


     self.sp() 
     self.hbox_gen() 


    def mode_changed(self,i): 
     print "Mode has changed to", i 
     self.sp_stack.setCurrentIndex(i) 


    def sp(self): 
     self.sp_stack=QtGui.QStackedWidget(self) 
     self.sp1 = QtGui.QWidget() 
     self.sp2 = QtGui.QWidget() 

     self.sp1UI() 
     self.sp2UI() 

     self.sp_stack.addWidget(self.sp1) 
     self.sp_stack.addWidget(self.sp2) 

    def sp1UI(self): 
     self.sp1_layout=QtGui.QHBoxLayout() 
     self.sp1_lcd=QtGui.QLCDNumber(self) 
     self.sp1_layout.addWidget(self.sp1_lcd) 
     #self.sp1.connect(lcd_pv.display) 
     self.sp1.setLayout(self.sp1_layout) 

    def sp2UI(self): 
     self.sp2_layout=QtGui.QHBoxLayout() 
     self.sp2_spinBox=QtGui.QSpinBox() 
     self.sp2_spinBox.setRange(self._sp_min,self._sp_max) 
     self.sp2_spinBox.setValue(self._sp) 
     self.sp2_layout.addWidget(self.sp2_spinBox) 
     self.sp2.setLayout(self.sp2_layout) 


    def hbox_gen(self): 

     self.mode=QtGui.QComboBox(self) 
     self.mode.addItem("OFF") 
     self.mode.addItem("ON") 
     self.mode.currentIndexChanged.connect(self.mode_changed) 

     self.hbox = QtGui.QHBoxLayout() 
     self.hbox.addWidget(self.mode) 
     self.hbox.addWidget(self.sp_stack) 



class tabdemo(QtGui.QTabWidget): 
    def __init__(self, parent = None): 
     super(tabdemo, self).__init__(parent) 
     self.tab1 = QtGui.QWidget() 
     self.tab2 = QtGui.QWidget() 
     self.tab3 = QtGui.QWidget() 

     self.addTab(self.tab1,"Tab 1") 
     self.addTab(self.tab2,"Tab 2") 
     self.addTab(self.tab3,"Tab 3") 
     self.tab1UI() 
     self.tab2UI() 
     self.tab3UI() 
     self.setWindowTitle("Heizung") 


    def tab1UI(self): 


     K1=Kaskade(28,5,40) 
     K2=Kaskade(30,5,40) 
     K3=Kaskade(35,5,40) 

     K1.mode.setCurrentIndex(1) 
     K3.mode.setCurrentIndex(1) 

     vbox = QtGui.QVBoxLayout() 
     vbox.addLayout(K1.hbox) 
     vbox.addLayout(K2.hbox) 
     vbox.addLayout(K3.hbox) 
     self.tab1.setLayout(vbox) 

     self.setTabText(1,"Tab1") 

    def tab2UI(self): 
     self.setTabText(1,"Tab2") 


    def tab3UI(self): 
     self.setTabText(2,"Tab3") 








def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = tabdemo() 
    ex.show() 


    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

답변

0

입니다. 또한 self.hbox 레이아웃을 수행해야합니다. Kaskade :

class Kaskade(QtGui.QWidget): 
    [...] 
    def hbox_gen(self): 
     [...] 
     self.hbox = QtGui.QHBoxLayout(self) 
     [...] 


class tabdemo(QtGui.QTabWidget): 
    [...] 
    def tab1UI(self): 
     [...] 
     vbox = QtGui.QVBoxLayout() 
     vbox.addWidget(K1) 
     vbox.addWidget(K2) 
     vbox.addWidget(K3) 
     self.tab1.setLayout(vbox) 
     [...] 
+0

감사합니다. 나는 둘 다 시도했다. 1 위. self.hbox = QtGui.QHBoxLayout()을 self.hbox = QtGui.QHBoxLayout (self)로 변경했습니다. 결과적으로 GUI가 더 이상 표시되지 않습니다. – SteffenUM

+0

2nd. vbox.addWidget (K1.hbox)을 vbox.addWidget (K1)으로 변경했습니다. TypeError ... 예기치 않은 Type "Kaskade"를 반환합니다. 그래서 문제는 아직 해결되지 않았습니다. – SteffenUM

+0

@SteffenUM 당신이 제대로 변경하지 않았다고 생각하는 링크는 다음과 같습니다 : https://gist.github.com/eyllanesc/6c97968b3c5185b63873f9b10cceec99 – eyllanesc