在PyQt4中将Button连接到它时不运行函数

时间:2016-06-04 18:56:24

标签: python-3.x button pyqt4

我是PyQt4的新手,在尝试将按钮连接到某个功能时遇到了问题。

我正在使用PyQt 4.11.4。

clicked.connect方法和下面评论中的行似乎都不起作用。

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 个答案:

答案 0 :(得分:1)

首先,通过在__name__ == "__main__"测试之后直接放置语句,可以引入全局变量。例如,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)的下一行。在第二行,您调用setupUiself参数设置为临时Window对象,Window参数设置为QtGui.QMainWindow对象({{ 1}})。毫无疑问,这不起作用,实际上它有点令人惊讶。

最后,强烈建议在Qt中使用布局来排列小部件。这使得对MainWindow的调用变得多余。将小部件添加到布局中也会设置其父级,因此您不需要单独执行此操作。我认为你绝对应该阅读the docs on layout management(除了编写自己的布局管理器的最后一节)。

应用上面的所有建议,你会得到类似的东西......

setGeometry()