2017-10-07 10 views
1

私はQtレイアウトとウィジェット管理を検討していましたが、私が説明できない振舞いに出くわしました。自動追加の目的は何ですか?objectName '_layout'を持つQLayout

私は、次のような階層でベースUIを持っています。

MainWindow(QMainWindow) -> 
    centralwidget (QWidget), 
    menubar(QMenuBar), 
    statusbar(QStatusBar) 

後には、この文脈では重要ではありません、私はcentralwidgetに、いくつかのレイアウトやウィジェットを追加、しかし、私は信じて。

今、私たちはメインウィンドウの子をチェックすると、オブジェクトとそののObjectNameは、我々は次のように表示されます。

<PyQt5.QtWidgets.QLayout object at 0x00000000089425E8> _layout 
<PyQt5.QtWidgets.QWidget object at 0x00000000087C6F78> centralwidget 
<PyQt5.QtWidgets.QMenuBar object at 0x0000000008942048> menubar 
<PyQt5.QtWidgets.QStatusBar object at 0x00000000089420D8> statusbar 

何らかの理由で、QLayoutオブジェクト_layoutが表示されますについて。ただこれが全てではありません。このQLayoutは永続的ではなく、場合によってはサイズ変更などで追加や削除が行われているようです。私は、resizeイベント用eventFilterを追加し、ここでいくつかのウィンドウのサイズが変更後のオブジェクトのアドレスですしている:

<PyQt5.QtWidgets.QLayout object at 0x0000000008942708> _layout 
<PyQt5.QtWidgets.QLayout object at 0x00000000089425E8> _layout 
<PyQt5.QtWidgets.QLayout object at 0x0000000008942798> _layout 
<PyQt5.QtWidgets.QLayout object at 0x00000000089428B8> _layout 

レイアウトがあるが、すべての時間は、オブジェクトが新規です。

ここでは何が起こっていますか?このQLayoutの目的は何ですか?なぜこのように動作しますか?

答えて

2

QMainWindowクラスすべてのツールバー、メニューバー、ドックウィジェット、ステータスバーと中央のウィジェットエリア管理ビルトインカスタムレイアウトがあります。このレイアウトは削除、または交換することはできません

main-window-layout

を別のレイアウトでそれをやろうとすると、Qtは文句を言うでしょう(あるいはクラッシュするかもしれません)。

reprに示されているオブジェクトIDはあまり意味がありません。これは、レイアウトのPyQtラッパーのIDであり、基礎となるC++オブジェクトのメモリーアドレスではありません。レイアウトは実際にはQMainWindowLayoutですが、これはパブリックなタイプではないため、PyQtはQLayout(ベースクラス)のみを返します。 PyQtは、アクセスするたびに同じ基礎となるC++オブジェクトの周りに新しいラッパーを返す可能性があります。

+0

説明ありがとうございます!そしてあなたが正しいのですが、なんらかの理由で、PyQtは同じ基底のC++オブジェクトの周りに新しいラッパーを返します。私はラップされたオブジェクトのアドレスを取得する方法を探し、 '' 'sip.unwrapinstance(obj)' 'を見つけました。これらの異なるPythonラッパーのために同じアドレスを返します。 – wombatonfire

関連する問題