2016-06-04 3 views
0

PyQt4를 처음 접했고 버튼을 함수에 연결하려고 할 때 문제가 발생했습니다.PyQt4에서 Button을 연결할 때 함수가 실행되지 않습니다.

Im은 PyQt 4.11.4를 사용한다.

clicked.connect 메서드 나 아래 주석의 줄이 작동하지 않는 것 같습니다. __name__ == "__main__" 시험 직후 문을 배치하여

from PyQt4 import QtGui, QtCore 
import sys 

class Window(QtGui.QMainWindow): 

    def __init__(self): 
     super(Window, self).__init__() 

    def setupUi(self, Window): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(200, 200) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setGeometry(0,0,100,100) 
     MainWindow.setCentralWidget(self.centralwidget) 

     self.pushButton = QtGui.QPushButton(self.centralwidget) 
     self.pushButton.setGeometry(QtCore.QRect(100, 50, 55, 20)) 
     self.pushButton.setText("Run") 

     self.pushButton.clicked.connect(self.run) 
     #OR QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL('clicked()'),self.run) 

    def run(self): 
     print("ok") 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    Window().setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

답변

1

우선, 당신은 전역 변수를 소개합니다. 예를 들어 MainWindow 변수는 전역 변수이며 이후 Window.setupUi 메서드에서 변경됩니다. 이것은 바람직하지 않습니다. main 함수를 만들고 그 함수 만 호출하는 것이 좋습니다. 예를 들어,이 라인을이 코드로 변경하면 ...

def main(): 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    Window().setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 

당신은 런타임 오류가 발생하여 잘못된 것이 있음을 알 수 있습니다.

그런데 대문자와 소문자가있는 클래스 이름을 시작하는 것은 Python의 규칙입니다. 그러므로, 언뜻 보면 나는 MainWindow이 수업이었다고 생각했다. 그러나 그것은 하나의 대상이며 더 나은 이름은 mainWindow으로 변경되어야합니다. StackOverflow 구문 강조 표시가 대문자로 시작하는 모든 식별자를 연한 파란색으로 표시하는 것에 주목하십시오.

따라서 신호의 문제는 두 개의 주 창 개체를 만듭니다. 먼저 MainWindow = QtGui.QMainWindow()을 입력하고 다음 줄을 Window().setupUi(MainWindow)으로 만듭니다. 두 번째 줄에서는 self 매개 변수를 임시 Window 개체로 설정하고 Window 매개 변수를 QtGui.QMainWindow 개체 (MainWindow)로 설정하여 setupUi을 호출합니다. 이것이 효과가 없다는 것은 놀라운 일이 아닙니다. 실제로는 전혀 놀라운 일이 아닙니다.

마지막으로 Qt의 레이아웃을 사용하여 위젯을 정렬하는 것이 좋습니다. 이렇게하면 setGeometry()에 대한 호출이 불필요합니다. 위젯을 레이아웃에 추가하면 해당 부모가 설정되므로 별도로이 작업을 수행 할 필요가 없습니다. 나는 당신이 확실히 the docs on layout management을 읽어야한다고 생각한다. (당신 자신의 레이아웃 매니저를 작성하는 마지막 절을 제외하고). ...

from PyQt4 import QtGui, QtCore 
import sys 

class Window(QtGui.QMainWindow): 

    def __init__(self): 
     super(Window, self).__init__() 
     self._setupUi() 

    def _setupUi(self): 

     self.resize(200, 200) 

     # the central widget is called my widget to prevent clashes with 
     # the centralWidget() function. 
     self.mainWidget = QtGui.QWidget() 
     self.setCentralWidget(self.mainWidget) 

     self.mainLayout = QtGui.QVBoxLayout() 
     self.mainWidget.setLayout(self.mainLayout) 

     self.pushButton = QtGui.QPushButton() 
     self.pushButton.setText("Run") 
     self.mainLayout.addWidget(self.pushButton) 

     self.pushButton.clicked.connect(self.run) 

    def run(self): 
     print("ok") 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    mainWindow = Window() 
    mainWindow.setObjectName("mainWindow") # can be omitted. 
    mainWindow.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 
+0

덕분에 자세한 답변을 많이

는 위의 모든 조언을 적용하고이 같은 것을 얻을! 그 조언을 주신 덕분에 레이아웃 관리 문서를 확실히 읽을 수 있습니다. –

+0

도움이 될 수있어서 기쁩니다. 문제가 해결되면 질문을 _answered_로 표시하십시오. – titusjan

관련 문제