plɹoM ollǝH

ǝldɯᴉs puɐ llɐɯs ʇᴉ dǝǝʞ

PySide2 終了時のメモリアクセスエラー

f:id:dungeonneko:20180305180811p:plain

原因調べるのが面倒くさいので困ります

from PySide2 import QtWidgets
import sys

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    main = QtWidgets.QMainWindow()

    action = QtWidgets.QAction(main)
    action.setText('Action')
    action.triggered.connect(lambda: print('action executed'))
    menu = QtWidgets.QMenu('menu')
    menu.addAction(action)
    main.menuBar().addMenu(menu)
    main.show()
    sys.exit(app.exec_())

↑たとえばコレ。一見ちゃんと動いてそうなプログラムですが、メニューからアクションを実行すると終了時にエラーが出ます。こんなのPySide1でも起きてましたっけ?これを回避するには

# parentをちゃんと指定する
# QMenuを入れ子にする場合も全部のSubmenuに指定する
menu = QtWidgets.QMenu('menu', main) 

こう書いておく必要があります。デフォルト引数で「parent = Q_NULLPTR」とか書いてあるからaddMenuしたときに設定してくれるのかな~とか、淡い期待を抱いてた時期が私にもありました(なんでデフォルトNULLなんだい?)とりあえずメモリアクセスエラーに出会ったらparent指定してない箇所を見なおすことにしました。QtビルドしてPDB作るのは面倒くさいからやらないです⇒やりました