LoginSignup
0
0

More than 5 years have passed since last update.

Qt for PythonのQMainWindow.centralWidgetで取得する領域は事前に設定が必要か?

Last updated at Posted at 2019-01-16

「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は、メニューとは違って、なんでも好きなものを設定できるため、あらかじめ設定されていないという気がしました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0