4

メインの「表示」ウィジェットといくつかのマイナーウィジェットを備えた QMainWindow があります。マウスがウィンドウに出入りするときに、マイナー ウィジェットのオン/オフを切り替える機能が欲しいです。

必須ではないウィジェットの表示/非表示を実装enterEventし、呼び出しを行うことで、この基本的な機能を実現できます。leaveEventただし、Qt4 のデフォルトの動作は、QMainWindow ジオメトリを固定したままにし、重要なウィジェットのサイズを変更することです。このウィジェットのジオメトリを維持し、必要に応じて QMainWindow を移動/サイズ変更したいと思います。これは可能ですか?

PyQt4 の簡単な例を次に示します。

from PyQt4.QtGui import *
from PyQt4.QtCore import *

app = QApplication([''])

class MyWidget(QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)

        layout = QVBoxLayout()
        self.setLayout(layout)
        self.main = QPushButton("major")
        self.main.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.minor = QPushButton("minor")
        layout.addWidget(self.main)
        layout.addWidget(self.minor)

    def enterEvent(self, event):
        self.minor.show()

    def leaveEvent(self, event):
        self.minor.hide()

mw = QMainWindow()
mw.setCentralWidget(MyWidget())
mw.show()

app.exec_()

「主要な」ボタンが拡大/縮小する代わりに、このボタンを囲むように MyWidget の境界を変更したいと思います。

4

2 に答える 2

1

PySide を使用して、Mac OS X であなたの例をハッキングしました。しばらく試した後、次の解決策を見つけました。

from PySide.QtGui import *
from PySide.QtCore import *

app = QApplication([''])

class MyWidget(QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)

        layout = QVBoxLayout()
        self.setLayout(layout)
        self.main = QPushButton("major")
        self.main.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.minor = QPushButton("minor")
        layout.addWidget(self.main)
        layout.addWidget(self.minor)

    def resizeEvent(self, event):
        self.appendix = self.minor.frameGeometry().height() + 2
        if self.minor.isVisible():
            self.varheight = mw.height() - self.appendix
        else:
            self.varheight = mw.height()

    def enterEvent(self, event):
        self.minor.show()
        mw.resize(mw.width(), self.varheight + self.appendix)

    def leaveEvent(self, event):
        self.minor.hide()
        mw.resize(mw.width(), self.varheight)

mw = QMainWindow()
mw.setCentralWidget(MyWidget())
mw.show()

app.exec_()

初期状態ではマウスの位置がチェックされないため、これは完全ではありません。また、魔法の「+ 2」は、おそらくウィジェットジオメトリの他のメトリックから計算できるはずです。しかし、例としては問題ありません。

この実装が正しくなるまでに数時間かかりました。すべての計算が一定の状態にあることを確認することが重要でした。そうしないと、レイアウト エンジンが理解しにくい結果を生成したり、無限ループに陥ったりすることさえあります。

resizeEventウィジェットのサイズから適切な値を取得しますが、それ以外は何も取得しません。次にenterEventleaveEventこれらの値を使用してサイズ変更を行います。

変数が初期化されていません。それは可能ですが、最初のサイズ変更は他のイベントよりも早く行われます。

于 2012-12-15T03:01:04.790 に答える
0

このコードを試すことができます。QWidget をサブクラス化する代わりに、QMainWindow を直接サブクラス化できます。

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyWindow( QMainWindow ):
    def __init__( self, parent = None ):
        QMainWindow.__init__( self, parent )

        self.widget = QWidget( self )
        lyt = QVBoxLayout()

        self.main = QPushButton( "major" )
        self.minor = QPushButton( "minor" )

        if not self.underMouse() :
            self.minor.hide()
            self.setMaximumHeight( self.main.sizeHint().height() )

        else :
            self.setMaximumHeight( self.minor.sizeHint().height() + self.main.sizeHint().height() )

        lyt.addWidget( self.main )
        lyt.addWidget( self.minor )

        self.widget.setLayout( lyt )
        self.setCentralWidget( self.widget )

    def enterEvent( self, event ) :

        self.minor.show()
        self.setMaximumHeight( self.minor.sizeHint().height() + self.main.sizeHint().height() )
        self.adjustSize()

        event.accept()

    def leaveEvent( self, event ):

        self.minor.hide()
        self.setMaximumHeight( self.main.sizeHint().height() )
        self.adjustSize()

        event.accept()

if __name__ == '__main__' :

    app = QApplication( [] )

    Gui = MyWindow()
    Gui.show()

    app.exec_()
于 2013-09-05T11:16:24.130 に答える