Pyside6: Создайте QTabWidget с функцией, а не с классом

#python #qdialog #qtabwidget #pyside6 #pyqt6

Вопрос:

Я пытался создать приложение с помощью Pyside6 и, похоже, не могу понять, почему мы не можем создать QDialog с QTabWidget только с функциями. Я не уверен, что где-то ошибаюсь, поэтому вот код, который я написал:

Импорт:

 from PySide6.QtWidgets import (QMessageBox, QApplication, QWidget, QGridLayout, QLabel, QMainWindow, QTabWidget,
                               QVBoxLayout)
from sys import argv
 

Функция 2 вкладок:

 def WelPage():
    grid = QGridLayout()
    wel_tab = QWidget()
    wel_tab.setLayout(grid)

    lab_name = QLabel("This is a label")
    git_link = QLabel("This is a link")
    git_link.setOpenExternalLinks(True)
    yt_link = QLabel("Another Link")
    yt_link.setOpenExternalLinks(True)

    grid.addWidget(lab_name, 0, 1)
    grid.addWidget(git_link, 1, 0)
    grid.addWidget(yt_link, 1, 3)


 def AboutPage():
    about_tab = QWidget()
    lo = QVBoxLayout()
    purpose = QLabel("A really long label")

    lo.addWidget(purpose)
    about_tab.setLayout(lo)
 

И основная функция:

 def main():
    w = QWidget()
    layout = QVBoxLayout()
    tw = QTabWidget()
    w.resize(450, 250)
    w.setWindowTitle('Window Title')
    layout.addWidget(tw)

    tw.addTab(WelPage(), "Welcome Screen")
    tw.addTab(AboutPage(), "About")
    tw.show()

    w.setLayout(layout)
    w.show()
    app.exec()


if __name__ == "__main__":
    app = QApplication(argv)
    main()
 

Выход:
SC чистого холста

Все, что это делает, — это выводит пустой диалог. Не знаю, почему это так. Почему я должен быть вынужден использовать класс, а не этот метод?

Комментарии:

1. addTab() ожидает QWidget в качестве первого аргумента, в противном случае он проигнорирует вызов (и вернет -1). Обе функции возвращаются None , так что вы ничего не добавляете в виджет вкладки, как вы практически делаете tw.addTab(None, "Welcome Screen") . Добавьте return wel_tab к WelPage и return about_tab к AboutPage .

2. @musicamante Большое тебе спасибо. Ваши ответы мне очень помогли 🙂

Ответ №1:

Похоже, вам не хватает определенных основ работы виджетов в Qt.
Предполагается, что у QWidgets (как правило) должен быть родитель. Поэтому, когда вы создаете экземпляр дочернего виджета, вы передаете конструктору родительский. Таким образом, Qt знает, как они должны отображаться. Я рекомендую вам следовать некоторым учебным пособиям о том, как создавать базовые графические интерфейсы с Qt на Python.

Затем, поскольку вам нужно будет знать родителя в функции, вы можете либо использовать глобальную переменную, либо передать ее в качестве параметра функции, например :

 def add_about_widget(parent):
    about_widget = QWidget(parent)  # <--- here !
    ...
 

Если вы хотите иметь пункты меню, я рекомендую вам использовать QMenuBar. Кроме того, Qt прекрасно создаст для вас окно, когда вы попросите его в show() свой основной виджет, но явное создание главного окна, на мой взгляд, делает вещи более понятными.

Комментарии:

1. Проблема связана не с родителем, а с тем, что функции возвращаются None . Использование QTabWidget родительский аргумент почти бесполезен, так как его необходимо использовать addTab с правильным аргументом QWidget.