将整个 *ui 文件加载到另一个 *.ui 文件的 frame/widget 中
Load whole *ui file in an frame/widget of another *.ui file
我正在为家庭项目开发一个小型用户界面。我用 QT-Designer 创建了一个 *.ui 文件。这是我的主要 window,带有一些导航按钮、标签等。现在,当我单击导航按钮时,我正在努力在主要 window 的框架或小部件中加载另一个 *.ui (例如内容)。我正在使用 pyqt4,我必须在 raspberry pi.
上使用 python 来实现它
我也使用了搜索,但没有找到解决我问题的有效方法。也许真的很容易,但对我来说很难。
*重要提示:我不想重新组织按钮和标签!我想在主 window!
中的小部件或框架中加载整个 *.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 windows,所以我还需要在每个 window 上使用我的整个导航按钮。
我的目标是用我的导航按钮创建一个 window 并在其中创建一个 frame/widget,我可以在其中 promote/load 其他 *ui 文件。或者有没有没有frames/widgets的另一个好的解决方案?
首先,我的解决方案的基础是推广一个小部件,为此我将按以下方式构建项目:
├── 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 打开的菜单的当前页面之后
然后它将升级为使用页面文件夹中的小部件:
然后主要将按钮与适当的索引相关联:
main.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。
我正在为家庭项目开发一个小型用户界面。我用 QT-Designer 创建了一个 *.ui 文件。这是我的主要 window,带有一些导航按钮、标签等。现在,当我单击导航按钮时,我正在努力在主要 window 的框架或小部件中加载另一个 *.ui (例如内容)。我正在使用 pyqt4,我必须在 raspberry pi.
上使用 python 来实现它我也使用了搜索,但没有找到解决我问题的有效方法。也许真的很容易,但对我来说很难。
*重要提示:我不想重新组织按钮和标签!我想在主 window!
中的小部件或框架中加载整个 *.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 windows,所以我还需要在每个 window 上使用我的整个导航按钮。 我的目标是用我的导航按钮创建一个 window 并在其中创建一个 frame/widget,我可以在其中 promote/load 其他 *ui 文件。或者有没有没有frames/widgets的另一个好的解决方案?
首先,我的解决方案的基础是推广一个小部件,为此我将按以下方式构建项目:
├── 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 打开的菜单的当前页面之后
然后它将升级为使用页面文件夹中的小部件:
然后主要将按钮与适当的索引相关联:
main.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。