#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()
Все, что это делает, — это выводит пустой диалог. Не знаю, почему это так. Почему я должен быть вынужден использовать класс, а не этот метод?
Комментарии:
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.