在Python (PyQt4)中显示弹出窗口

2 投票
1 回答
29810 浏览
提问于 2025-04-17 12:00

我想知道怎么让一个对话框在用户点击按钮时弹出来。

我对Python和PyQt/QtDesigner都比较新,才用了一个月,但我觉得自己掌握得还不错。

我现在有一个主对话框(就是应用程序的主要部分),这个对话框是我在QtDesigner里设计的。我用pyuic4easy把.ui文件转换成了.py文件。

我想做的是:在QtDesigner里设计一个新的对话框,然后让它在用户点击第一个(主)对话框上的按钮时弹出来。

这是我主对话框的代码:

import sys
from PyQt4.QtCore import *
from loginScreen import *


class MyForm(QtGui.QDialog):

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL('clicked()'), self.popup)     
        ...

        ... Some functions ...

   def popup(self):
        #Pop-up the new dialog

if __name__ == "__main__":
   app = QtGui.QApplication(sys.argv)
   myapp= MyForm()
   myapp.show()
   sys.exit(app.exec_())

你可以看到,我把第一个按钮连接到了一个叫'popup'的方法,但这个方法需要填入代码才能让我的第二个窗口弹出来。我该怎么做呢?记住,我已经在QtDesigner里设计好了第二个对话框,不需要再创建一个新的。

谢谢大家的帮助!

1 个回答

10

你可以看到,我把第一个按钮连接到了一个叫做 'popup' 的方法,这个方法需要写一些代码来让我的第二个窗口弹出来。我该怎么做呢?

其实和你为主窗口(MyForm)做的差不多。

像往常一样,你需要为第二个对话框的 QtDesigner 代码写一个包装类(就像你为 MyForm 做的那样)。我们可以把它叫做 MyPopupDialog。然后在你的 popup 方法里,你创建这个类的一个实例,然后用 exec_()show() 来显示这个实例,具体用哪个取决于你想要的是模态对话框还是非模态对话框。(如果你对模态和非模态的概念不太了解,可以参考一下 文档。)

所以整体的代码可能看起来像这样(稍微修改了一下):

# Necessary imports

class MyPopupDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        # Regular init stuff...
        # and other things you might want


class MyForm(QtGui.QDialog):
    def __init__(self, parent=None):
        # Here, you should call the inherited class' init, which is QDialog
        QtGui.QDialog.__init__(self, parent)

        # Usual setup stuff
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

        # Use new style signal/slots
        self.ui.pushButton.clicked.connect(self.popup)     

        # Other things...

   def popup(self):
        self.dialog = MyPopupDialog()

        # For Modal dialogs
        self.dialog.exec_()

        # Or for modeless dialogs
        # self.dialog.show()

if __name__ == "__main__":
   app = QtGui.QApplication(sys.argv)
   myapp= MyForm()
   myapp.show()
   sys.exit(app.exec_())

撰写回答