Загружать весь * ui файл в рамку / виджет другого * .ui файла - PullRequest
0 голосов
/ 22 декабря 2018

Я занимаюсь разработкой небольшого пользовательского интерфейса для домашнего проекта.Я создал * .ui файл с QT-Designer.Это мое главное окно с некоторыми навигационными кнопками, ярлыками и так далее.Теперь я пытаюсь загрузить другой * .ui (например, с содержимым) в рамку или виджет главного окна, когда я нажимаю на кнопки навигации.Я использую pyqt4, и я должен реализовать его с python на Raspberry Pi.

Я также использовал поиск, но я не нашел работающего решения для моей проблемы.Может быть, это действительно легко, но для меня это сложно.

* Важно: я не хочу реорганизовать кнопки и ярлыки!Я хочу загрузить весь * .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 окон, поэтому мне также нужны целые навигационные кнопки в каждом окне.Моя цель - создать ОДНО окно с моими навигационными кнопками и рамкой / виджетом, в котором я могу продвигать / загружать другие * пользовательские файлы.Или есть другое хорошее решение без рам / виджетов?

enter image description here

1 Ответ

0 голосов
/ 26 декабря 2018

Прежде всего, в основе моего решения лежит продвижение виджета, для этого я буду структурировать проект следующим образом:

├── 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 позволяет иметь панели инструментов, 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 с правой стороны:

enter image description here

enter image description here

Каждая страница была добавлена ​​путем выбораОпция вставки страницы-> после текущей страницы меню, которое открывается по щелчку правой кнопкой мыши на QStackedWidget

Тогда будет предложено использовать виджет, который находится в папке страниц:

enter image description here

Затем в основном вы связываете кнопки с соответствующими индексами:

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_())

Полный пример здесь .

...