【问题标题】:Click menu and open new window单击菜单并打开新窗口
【发布时间】:2018-01-23 03:21:00
【问题描述】:

我使用 Qt 设计器创建了两个不同的窗口,input_window.ui 和 help_window.ui。这是用于显示输入窗口的 python 脚本。在输入窗口中,有一个菜单栏(“关于>>帮助”)。单击“帮助”时如何弹出帮助窗口?

这里是 init.py

import sys
from input_window import Ui_MainWindow
from PyQt5.QtWidgets import QMainWindow, QApplication
from help_window import Ui_Help



class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.Pophelp.triggered.connect(self.Ui_Help)


    def help_window(self):
        self.window=Ui_Help()
        self.window.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

这里是Ui_Help的代码

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Help(object):
    def setupUi(self, Help):
        Help.setObjectName("Help")
        Help.resize(251, 99)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("logo.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        Help.setWindowIcon(icon)
        self.gridLayoutWidget = QtWidgets.QWidget(Help)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(9, 9, 231, 81))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.gridLayoutWidget)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.plainTextEdit.setFont(font)
        self.plainTextEdit.setFrameShape(QtWidgets.QFrame.WinPanel)
        self.plainTextEdit.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.plainTextEdit.setLineWidth(1)
        self.plainTextEdit.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
        self.plainTextEdit.setReadOnly(True)
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.gridLayout.addWidget(self.plainTextEdit, 0, 0, 1, 1)

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

【问题讨论】:

  • @PRMoureu,对于答案部分的错误帖子感到抱歉,我已经更新了问题中的代码。
  • @PRMoureu,我看到有更新,但是很抱歉我当时没有看到详细信息,因为当时有问题,你能给出答案吗?这些答案似乎被删除了。

标签: python pyqt pyqt5 qt-designer qmenu


【解决方案1】:

Qt Designer 用于以简单的方式实现视图,因此生成的类是面向视图的,我们的工作是像您对 Ui_MainWindowMainWindow 所做的那样实现逻辑,与您类似与Ui_Help。在您的情况下,我建议您在构建 help_window.ui 时使用 Dialog 模板,但如果您选择 Widget 模板没有问题,两者都非常兼容。

一个简单的解决方案是创建一个QDialog 并在其中实现Ui_Help 视图,如下所示:

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.Pophelp.triggered.connect(self.help_window)

    def help_window(self):
        # If you pass a parent (self) will block the Main Window,
        # and if you do not pass both will be independent,
        # I recommend you try both cases.
        widget = QDialog(self)
        ui=Ui_Help()
        ui.setupUi(widget)
        widget.exec_()

如果你想在Ui_Help 中实现一些逻辑,我建议创建一个类似于MainWindow 的类,如下所示:

class Help(QDialog, Ui_Help):
    def __init__(self, parent=None):
        super(Help, self).__init__(parent)
        self.setupUi(self)

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.Pophelp.triggered.connect(self.help_window)

    def help_window(self):
        widget = Help()
        widget.exec_()

【讨论】:

    【解决方案2】:

    您没有包含 input_window.ui,因此很难完全复制您正在做的事情,但我认为您遇到的主要问题源于这一行:

    self.Pophelp.triggered.connect(self.Ui_Help)
    

    您不想将按钮连接到 Ui_Help,而是要将其连接到 self.help_window

    【讨论】:

    • 感谢解答,连接help_window时提示“属性错误:没有Ui_Help没有属性显示”。
    【解决方案3】:

    如果将 help_window 更改为下面的代码,它就可以工作。

    def help_window(self):
        dialog=QtWidgets.QDialog()
        dialog.ui=Ui_Help()
        dialog.ui.setupUi(dialog)
        dialog.exec_()
        dialog.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 2012-05-05
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      相关资源
      最近更新 更多