【问题标题】:How to put a child window inside a main window(PyQt)如何将子窗口放在主窗口中(PyQt)
【发布时间】:2015-05-26 23:02:10
【问题描述】:

我在 stackoverflow 和 google 中查看了几天来寻找类似我的案例,但我发现的所有示例都不起作用。

我想要的是让我的父窗口带有菜单,然后从该菜单调用其他子窗口并在父窗口中执行/显示它们。

我尝试在父窗口中放置一个小部件并在其中调用子窗口,使用 MDIArea,但没有任何效果。

观察: 我的屏幕文件是从 Qt 设计器生成的,我正在制作单独的类来操作小部件、按钮等,以使一切更有条理。

我使用 QtDesigner 在我的主窗口中创建了 MdiArea,并在通过单击 MdiArea 内部调用子窗口(也使用 QtDesigner 创建的小部件)的菜单触发的类中创建了它们。

from resources.SubWindowQtDes import Ui_SubWindow
from resources.MainWindowQTDes import Ui_MainWindow
class cadastraAluno(Ui_SubWindow,Ui_MainWindow):
    def __init__(self, parent=None):
        super(cadastraAluno, self).__init__(parent = None)
        dialog = Ui_SubWindow()
        window = Ui_MainWindow()
        mdi = window.mdiArea
        mdi.addSubWindow(dialog, flags = 0)
        dialog.show()

【问题讨论】:

  • 如果您确实希望子窗口位于父窗口内部,那么 MdiArea 可能是要走的路。不过,这些并不是真正的子窗口,它们只是 MdiArea 小部件的子窗口。当你尝试这个时它是如何失败的?
  • 我在问题中放了一段代码(仍在学习如何在stackoverflow中使用markdown),其中包含我称为MdiArea的类。问题是当我单击菜单调用 de Mdi 内的子窗口时,Eclipse 显示一个错误,告诉我我的 Ui_MainWindow 没有属性 mdiArea,尽管我使用自动完成只是为了确定。
  • mdiarea 是我在 QtDesigner 生成的文件中给 QmdiArea 的名称。
  • 您是否忘记实例化Ui_MainWindow(例如window = Ui_MainWindow(),末尾带有())?
  • 嗯,我设法跳过了错误...我使用 class cadastraAluno(QMainWindow,Ui_MainWindow)self.setupUi(self) 更改了代码。之后 Eclipse 不再显示错误,但没有发生,子窗口没有被调用。

标签: qt pyqt parent childwindow


【解决方案1】:

这是我通常为子窗口做的事情:

class subwindow(QtGui.QWidget):
    def createWindow(self,WindowWidth,WindowHeight):
       parent=None
       super(subwindow,self).__init__(parent)
       selt.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
       self.resize(WindowWidth,WindowHeight)

class mainwindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
       [...]

    def createsASubwindow(self):
       self.mySubwindow=subwindow()
       self.mySubwindow.createWindow(500,400)
       #make pyqt items here for your subwindow
       #for example self.mySubwindow.button=QtGui.QPushButton(self.mySubwindow)

       self.mySubwindow.show()

这样你就有了一个子窗口,它始终位于主窗口的顶部,并且只能被实例化一次。

希望对你有帮助

【讨论】:

  • 它调用子窗口等等。但我无法将子窗口“嵌入”在父窗口中......
  • 我什至在单击菜单时调用的类中创建了一个 MdiWindow ...... Eclipse 上没有错误,但仍然没有任何反应......似乎我无法动态操作我的父窗口中的小部件,使它们根据需要出现和消失...
  • 也许你可以看看示例 Python27\Lib\site-packages\PyQt4\examples\demos\embeddeddialogs\embeddeddialogs.py,它可能会使用你的功能正在寻找。
  • 我找到了一种使用 QmdiArea 的方法。现在可以了。 :)
【解决方案2】:

我找到了办法。我用self.show()代替dialog.show()self.mdiArea代替window.mdiArea

现在我关闭窗口并使用我想要的小部件再次显示它。我想找到一种方法来“刷新”窗口。但这是另一个主题的主题。
非常感谢各位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2021-04-06
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多