「Qt for Pythonで終了するだけのアプリケーションを作成」で作成したアプリケーションに、ラベル(QLabel)を配置しようとしたところ、一つ気になることがありました。
ラベルを配置する、QMainWindowからcentalWidgetメソッドで取得するcenter areaは、事前になんらかのQWidgetのサブクラスのインスタンスを設定しておく必要があるようです。
from PySide2.QtWidgets import QApplication
from PySide2.QtWidgets import QMainWindow
from PySide2.QtWidgets import QVBoxLayout
def main() -> None:
app = QApplication()
window = QMainWindow()
central_widget = window.centralWidget()
central_widget.setLayout(QVBoxLayout())
window.show()
app.exec_()
if __name__ == '__main__':
main()
上のプログラムを実行すると以下のエラーが発生します。
$ python central.py
Traceback (most recent call last):
File "central.py", line 14, in <module>
main()
File "central.py", line 9, in main
central_widget.setLayout(QVBoxLayout())
AttributeError: 'NoneType' object has no attribute 'setLayout'
$
これを以下のように修正するとエラーは発生しません。
from PySide2.QtWidgets import QApplication
from PySide2.QtWidgets import QMainWindow
from PySide2.QtWidgets import QVBoxLayout
from PySide2.QtWidgets import QWidget # この行を追加
def main() -> None:
app = QApplication()
window = QMainWindow()
window.setCentralWidget(QWidget())
central_widget = window.centralWidget() # この行を追加
central_widget.setLayout(QVBoxLayout())
window.show()
app.exec_()
if __name__ == '__main__':
main()
QMainWindow.menuBarで取得するメニュー領域は、あらかじめ設定する必要はないようですので違いの理由が気になりましたが、QMainWindowのDetailed Descriptionを読むと、QMainWindoのcentalWidgetは、メニューとは違って、なんでも好きなものを設定できるため、あらかじめ設定されていないという気がしました。