1

私はこの問題に直面しており、Qt初心者であるため修正できません。

基本的に、私は をインスタンス化し、QToolButtonそれを にペアレント化しましたQTreeWidget。はQTreeWidget垂直レイアウト内にあり、QTreeWidget使用中のツール ボタンの位置を変更しようとすると、QTreeWidget.size()非常に予期せぬ間違った結果が得られます。

誰でもこれで私を助けることができますか?深く感謝いたします。ありがとう!

4

1 に答える 1

3

実際に行っている例は投稿されていませんが、ツリー ウィジェットの右下にボタンを付ける方法は次のとおりです。

編集:ツリーの上にウィジェットを合成したいことを確認した後、回答を置き換えました

eventFilter の使用

from PyQt4 import QtCore, QtGui

class Widget(QtGui.QWidget):

    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.resize(640,480)

        self.layout = QtGui.QVBoxLayout(self)
        self.layout.setSpacing(0)

        self.tree = QtGui.QTreeWidget(self)
        self.tree.installEventFilter(self)
        self.layout.addWidget(self.tree)

        self.button = QtGui.QToolButton(self.tree)
        self.button.setText("FOO")
        self.button.setMinimumSize(100, 30)

    def eventFilter(self, obj, event):
        if obj is self.tree and event.type() == event.Resize:
            self.alignTreeButton()       
        return False

    def alignTreeButton(self):
        padding = QtCore.QSize(5,5) # optional
        newSize = self.tree.size() - self.button.size() - padding
        self.button.move(newSize.width(), newSize.height())          

if __name__ == "__main__":
    app = QtGui.QApplication([])
    w = Widget()
    w.show()
    w.raise_()
    app.exec_()

ボタンはツリーの親になっているだけで、ツリーにイベント フィルターをインストールして、サイズ変更イベントをキャッチします。ツリーのサイズを変更したら、そのサイズを取得し、ボタンのサイズを差し引いて、ボタンを移動します。

コンポジションの使用

QTreeWidget を実際にサブクラス化し、QToolButton をメンバーとして構成し、resizeEvent()ローカルでオーバーロードしてサイズ変更を処理する方が効率的だと思います。まず、これにより動作処理が TreeWidget に対してローカルになり、よりクリーンになります。また、EventFilter がメイン ウィンドウに追加するオーバーヘッドを削減できると思います。eventFiler は、オブジェクトのすべてのイベントを処理するため、何度も呼び出される python callable になります。一方、TreeWidget のローカルの resizeEvent() は、サイズ変更中にのみ呼び出されます。

class Widget(QtGui.QWidget):

    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.resize(640,480)

        self.layout = QtGui.QVBoxLayout(self)
        self.layout.setSpacing(0)

        self.tree = TreeWidget(self)
        self.layout.addWidget(self.tree)     


class TreeWidget(QtGui.QTreeWidget):

    def __init__(self, *args, **kwargs):
        super(TreeWidget, self).__init__(*args, **kwargs)
        self.button = QtGui.QToolButton(self)
        self.button.setText("FOO")
        self.button.setMinimumSize(100, 30)

    def resizeEvent(self, event):
        super(TreeWidget, self).resizeEvent(event)
        self.alignTreeButton()

    def alignTreeButton(self):
        padding = QtCore.QSize(5,5) # optional
        newSize = self.size() - self.button.size() - padding
        self.button.move(newSize.width(), newSize.height())  
于 2012-06-30T05:12:03.723 に答える