我是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_())
答案 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)
的下一行。在第二行,您调用setupUi
,self
参数设置为临时Window
对象,Window
参数设置为QtGui.QMainWindow
对象({{ 1}})。毫无疑问,这不起作用,实际上它有点令人惊讶。
最后,强烈建议在Qt中使用布局来排列小部件。这使得对MainWindow
的调用变得多余。将小部件添加到布局中也会设置其父级,因此您不需要单独执行此操作。我认为你绝对应该阅读the docs on layout management(除了编写自己的布局管理器的最后一节)。
应用上面的所有建议,你会得到类似的东西......
setGeometry()