PyQt5: создайте несколько представлений с помощью дизайнера и соедините их в одном приложении.

Я завершил простое приложение в PyQt5, где я разработал пользовательский интерфейс в дизайнере QT, преобразовал в код py с помощью pyuic5 и запустил его через интерпретатор python.

Теперь я хотел бы добавить еще одно представление пользовательского интерфейса, хотя я не знаком с PyQt5, и в большинстве учебников, которые я нашел, упоминается только одно представление. Например, если бы я использовал Visual Studio, я мог бы создать новую форму и использовать методы отображения и скрытия для их отображения, например, когда я нажимаю кнопку, но я не уверен, как сделать то же самое с PyQt5.

Преобразованный код из pyuic5 включает также функцию if __name__ == "__main__", которая создает экземпляр и запускает приложение, поэтому достаточно ли просто взять что-нибудь над ним, чтобы получить только данные пользовательского интерфейса? И как мне создать представление из этого, чтобы я мог показывать и скрывать его по мере необходимости? Спасибо.

РЕДАКТИРОВАТЬ. Продвинулся немного дальше, так как нашел другой способ загрузки UI файлов. Похоже, что у PyQt есть метод, который может загружать файл пользовательского интерфейса напрямую, а не преобразовывать его в код Python. Это означает, что я могу создать класс, являющийся подклассом используемого типа окна (пример: QApplication, QMainWindow, QWidget и т. д.), и я могу получить доступ к этому объекту, как если бы он был формой в Visual Studio.

from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow
from PyQt5.uic import loadUI

class UIObject(QMainWindow):

    def __init__(self):
        super(UIObject, self).__init__()
        loadUI('mainapp.ui', self)
        self.mybutton1.clicked.connect(self.printhello)

    def printhello():
        print("hello")

app = QApplication(sys.argv)
mainview = UIObject()
mainview.show()
sys.exit(app.exec_())

Это загрузит файл пользовательского интерфейса и отобразит его на экране; Я предполагаю, что я могу использовать одну и ту же конструкцию для загрузки нескольких файлов ui, а затем показывать или скрывать их, как я делаю в Visual Studio? Кажется простым, но я не знаю много о QT или PyQT, я не уверен, почему этот способ обработки файлов ui чаще не рекламируется в учебниках; Я нашел это случайно, читая документы.


person Community    schedule 25.11.2017    source источник


Ответы (1)


Нашел решение, смешав разные ответы и сообщения с разных форумов.

Вы создаете первый класс как QMainWindow, в __init__ вы используете loadUi для загрузки файла дизайнера QT. Затем вы создаете второй класс, который содержит вашу вторую форму/представление, и в __init__ вы передаете в качестве параметра родительское представление (ваш первый класс или любой другой, который вам может понадобиться); так что вы можете скрыть основной вид и показать второй вид при нажатии кнопки. Когда вы закроете дополнительный вид, предыдущий вид снова появится.

Вы можете добавить столько разных окон, сколько захотите; хитрость заключается в том, чтобы всегда передавать родителя каждому из них и не забывать показывать/скрывать их соответствующим образом. Гораздо сложнее, чем формы Visual Studio, но это выполнимо.

class FirstForm(QMainWindow):

    def __init__(self):
        super(FirstForm, self).__init__()
        loadUi('firstform.ui', self)
        self.button1.clicked.connect(self.openOtherForm)

    def openOtherForm(self):
        self.hide()
        otherview = SecondForm(self)
        otherview.show()

class SecondForm(QDialog):

    def __init__(self, parent=None):
        super(SecondForm, self).__init__(parent)
        loadUi('secondform.ui', self)
        self.button2.clicked.connect(self.goBackToOtherForm)

    def openOtherForm(self):
        self.parent().show()
        self.close()

app = QApplication(sys.argv)
main = FirstForm()
main.show()
sys.exit(app.exec_())
person Community    schedule 07.12.2017