PyQT:如何打开新窗口

26

首先,类似的问题以前已经有人回答过了,但是我需要在这个问题上得到一些帮助。

我有一个包含一个按钮 (Class First) 的窗口,并且当按钮被按下时,我希望出现第二个空白窗口 (Class Second)

我尝试修改从这个问题中复制的代码:PyQT on click open new window,并编写了以下代码:

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

from PyQt4 import QtGui, QtCore
import sys
import design1, design2

class Second(QtGui.QMainWindow, design2.Ui_MainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)
        self.setupUi(self)

class First(QtGui.QMainWindow, design1.Ui_MainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.setupUi(self)

        self.pushButton.clicked.connect(self.on_pushButton_clicked)
        self.dialog = Second(self)

    def on_pushButton_clicked(self):
        self.dialog.exec_()

def main():
    app = QtGui.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()  

但是当按下时,会出现这个错误消息:

AttributeError: 'Second' object has no attribute 'exec_'

(design1和design2是从Qt Designer派生出来的.)

非常感谢您的想法。


虽然 QDialog 有一个 exec_ 方法,但是您已经子类化了 QMainWindow,而该类没有该方法。您可能想要了解这些类之间的区别,并决定您想要使用哪个类。 - three_pineapples
1个回答

51

这里我正在使用show方法。

这是一个可工作的示例(来自您的示例):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from PyQt4 import QtGui, QtCore
import sys
 
 
class Second(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)
 
 
class First(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.pushButton = QtGui.QPushButton("click me")
 
        self.setCentralWidget(self.pushButton)
 
        self.pushButton.clicked.connect(self.on_pushButton_clicked)
        self.dialog = Second(self)
 
    def on_pushButton_clicked(self):
        self.dialog.show()
 
 
def main():
    app = QtGui.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())
 
if __name__ == '__main__':
    main()

如果你需要每次点击按钮时都打开一个新的窗口,可以在on_pushButton_clicked方法中修改创建对话框的代码,像这样:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from PyQt4 import QtGui, QtCore
import sys
 
 
class Second(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)
 
 
class First(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.pushButton = QtGui.QPushButton("click me")
 
        self.setCentralWidget(self.pushButton)
 
        self.pushButton.clicked.connect(self.on_pushButton_clicked)
        self.dialogs = list()
 
    def on_pushButton_clicked(self):
        dialog = Second(self)
        self.dialogs.append(dialog)
        dialog.show()
 
 
def main():
    app = QtGui.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())
 
if __name__ == '__main__':
    main()

1
每当我点击按钮时,如何使第三个、第四个...窗口出现? - Kim
@Kim 我扩展了这个示例,使得可以出现多个窗口。 - salomonderossi
2
如果我只想打开一个窗口并将焦点更改为新打开的窗口,以便用户无法在父窗口中进行更改,怎么样? - aditya rawat
第二个窗口的事件没有正常工作。 - srinath samala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接