使用 Pyside 从主窗口打开子对话框窗口

Posted

技术标签:

【中文标题】使用 Pyside 从主窗口打开子对话框窗口【英文标题】:Opening a child dialog window from a main window with Pyside 【发布时间】:2013-07-31 17:11:07 【问题描述】:

所以我开始学习 python 和 pyside 进行 GUI 开发,我一直在使用 QT Designer 来提高速度并将 .ui 文件转换为 .py

我目前有一个“主窗口”ui 和一个“about”ui(主窗口被设置为主窗口,而 about 是一个空对话框)

如何从主窗口打开关于对话框? 以下代码从我的 main.py 中打开主窗口

class MainWindow(QMainWindow, mainwindow.Ui_MainWindow):
def __init__(self, parent=None):
    super(MainWindow, self).__init__(parent)
    self.setupUi(self)

app = QApplication(sys.argv)
form = MainWindow()
form.show()

app.exec_()

一切正常,它会打开主窗口。在我的主窗口中有菜单项,其中一个是“关于”选择,当用户单击它时我希望它显示我创建的另一个对话框 ui,我该怎么做?

在 mainwindow.py(从 ui 转换而来)中有以下引用:

self.actionAbout_mailer_0_0_1 = QtGui.QAction(MainWindow)
self.actionAbout_mailer_0_0_1.setObjectName("actionAbout_mailer_0_0_1")
self.menuAbout.addAction(self.actionAbout_mailer_0_0_1)

而about.py(从ui转换而来)看起来像这样:

from PySide import QtCore, QtGui

class About_Dialog(object):
def setupUi(self, Dialog):
    Dialog.setObjectName("Dialog")
    Dialog.resize(400, 300)
    self.aboutLbl = QtGui.QLabel(Dialog)
    self.aboutLbl.setGeometry(QtCore.QRect(110, 40, 171, 16))
    self.aboutLbl.setObjectName("aboutLbl")

    self.retranslateUi(Dialog)
    QtCore.QMetaObject.connectSlotsByName(Dialog)

def retranslateUi(self, Dialog):
    Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
    self.aboutLbl.setText(QtGui.QApplication.translate("Dialog", "Mailer version 0.0.1 by .....", None, QtGui.QApplication.UnicodeUTF8))

我想我需要在 mainwindow.py 中创建一个新函数,当调用它时会打开关于对话框,我不知道在该函数中放入什么,我也对插槽和连接感到困惑,如果有人可以提供帮助我提供了一些很棒的示例代码。

编辑:

我弄清楚了代码的功能部分,仍在弄清楚如何连接到菜单,但我连接到了一个按钮,该按钮执行此方法,然后一切正常:

def openAbout(self):
    aboutDialog = QtGui.QDialog(self)
    aboutUi = about.About_Dialog()
    aboutUi.setupUi(aboutDialog)
    aboutDialog.show()

【问题讨论】:

【参考方案1】:

如果您的 MainWindow 有一个名为 actionAbout 的菜单操作和一个名为 openAbout 的插槽,那么您需要做的就是连接 triggered 信号从 actionAbout 到插槽 openAbout

self.actionAbout.triggered.connect(self.openAbout)

该过程类似于您对按钮所做的操作。只需将本示例中使用的名称更改为您的应用程序中的名称即可。

【讨论】:

以上是关于使用 Pyside 从主窗口打开子对话框窗口的主要内容,如果未能解决你的问题,请参考以下文章

创建对话框实例并从主窗口调用它

能够在 PyQt5 中一次打开多个对话框的单窗口模式?

如何将值从主传递到对话框

如何在WPF中单击菜单项时在父窗口下打开子窗口?

VC TAB控件子对话框如何使用主对话框的成员函数.

如何在 WPF 中制作模态对话框?