【问题标题】:Load whole *ui file in an frame/widget of another *.ui file在另一个 *.ui 文件的框架/小部件中加载整个 *ui 文件
【发布时间】:2019-05-22 18:39:34
【问题描述】:

我正在为一个家庭项目开发一个小型用户界面。我用 QT-Designer 创建了一个 *.ui 文件。这是我的主窗口,带有一些导航按钮、标签等。现在,当我单击导航按钮时,我正在努力在主窗口的框架或小部件中加载另一个 *.ui(例如带有内容)。我正在使用 pyqt4,我必须在树莓派上用 python 实现它。

我也使用了搜索,但没有找到解决问题的有效解决方案。也许这真的很容易,但对我来说很难。

*重要提示:我不想重新组织按钮和标签!我想在主窗口中的小部件或框架中加载整个 *.ui 文件!

这是我的代码示例: 以下是我的main.py

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.uic import *

def buttonKlick1close():
start.close()

start = loadUi("start.ui")
start.connect(start.pushButton, SIGNAL("clicked()") , buttonKlick1close)

# there are other "signal-connections" for my navigation buttons but I 
# integreated all exactly the same like above. 
# actually when I click to another navigation button it will open an "def" 
# with "window2.showFullscreen()" and so on.... 

start.showFullScreen()
app.exit(app.exec_())

现在,当我单击导航按钮时,它总是会打开 7-8 个窗口,因此我还需要每个窗口上的整个导航按钮。 我的目标是用我的导航按钮和一个框架/小部件创建一个窗口,我可以在其中提升/加载其他 *ui 文件。或者有没有其他没有框架/小部件的好解决方案?

【问题讨论】:

  • 您是否尝试过在容器框架内设置布局?如果在容器框架内设置 VBox 或 HBoxLayout,则可以加载其他 ui 并将其作为布局的子级插入。
  • 你好,我没有尝试在容器框架内设置布局,因为我不知道如何。我阅读了一些关于 Vbox 和 HBoxLayout 的内容,但不知道如何在其中加载新的 ui 文件。下面是一些代码示例: 我为整个程序使用了一个 .py 文件。然后我用 qtDesginer 创建了 7-8 个 *ui 文件。在我的 .py 程序中,我使用“显示”代码加载 start.ui 文件。在这个 ui 文件中,有一些导航按钮和我要加载其他 ui 文件的框架/小部件的主要空间。
  • 现在我有几个 .ui 文件,每个 .ui 文件都有完整的导航按钮。但我想消除该解决方案,因为当我必须在导航中添加或更改某些内容时,我必须更改每个 .ui 文件。 -> 我的目标是只加载一个带有所有导航按钮和一个框架/小部件的 main.ui,我可以在其中加载其他 .ui 文件的内容。如何在 main.ui 框架/小部件中加载另一个 .ui?如果仍然不清楚,我可以上传一个方案。
  • 我还没有测试它。因为放假明天试试。但乍一看似乎非常好!
  • @eyllanesc 我检查了你的解决方案。它按预期工作! main.py 必要的(file)到->(“file”)有一点变化。但我的项目的整体完美解决方案。我会将它集成到我的应用程序中,我希望我可以访问 ui-widgets 内的所有按钮和标签并返回。之后我会发送捐款。非常感谢!

标签: python pyqt pyqt4 qt-designer


【解决方案1】:

首先,我的解决方案的基础是小部件的推广,为此我将按以下方式构建项目:

├── main.py
├── pages
│   ├── energypage.py
│   ├── fanpage.py
│   ├── homepage.py
│   └── statuspage.py
└── ui
    ├── energy.ui
    ├── fan.ui
    ├── home.ui
    ├── main.ui
    └── status.ui

页面的 .ui 将基于 Widget 模板,但主页面将使用 MainWindow 模板(MainWindow 允许有 ToolBars、StatusBar、DockWidgets、menuBar 等,所以我选择它作为主)。

由于 .ui 无法自行提升,因此将创建调用设计的类并遵循类似的结构,但您可以添加更多功能,例如 homepage.py:

import os
from PyQt4 import QtGui, uic


current_dir = os.path.dirname(os.path.abspath(__file__))
Form, Base = uic.loadUiType(os.path.join(current_dir, "../ui/home.ui"))


class HomeWidget(Base, Form):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent)
        self.setupUi(self)


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = HomeWidget()
    w.show()
    sys.exit(app.exec_())

main.ui 左侧有按钮,右侧有 QStackedWidget:

通过选择插入页面选项添加每个页面->在通过右键单击 QStackedWidget 打开的菜单的当前页面之后

然后它将被提升为使用页面文件夹中的小部件:

然后在主中将按钮与适当的索引相关联:

ma​​in.py

import os
from PyQt4 import QtGui, uic
from functools import partial

current_dir = os.path.dirname(os.path.abspath(__file__))
Form, Base = uic.loadUiType(os.path.join(current_dir, "ui/main.ui"))

class MainWidget(Base, Form):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent)
        self.setupUi(self)
        buttons = (self.homebutton, self.statusbutton, self.fanbutton, self.energybutton)
        for i, button in enumerate(buttons):
            button.clicked.connect(partial(self.stackedWidget.setCurrentIndex, i))

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    app.setStyle("fusion")
    w = MainWidget()
    w.show()
    sys.exit(app.exec_())

完整的例子是here

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多