私はこの問題に直面しており、Qt初心者であるため修正できません。
基本的に、私は をインスタンス化し、QToolButton
それを にペアレント化しましたQTreeWidget
。はQTreeWidget
垂直レイアウト内にあり、QTreeWidget
使用中のツール ボタンの位置を変更しようとすると、QTreeWidget.size()
非常に予期せぬ間違った結果が得られます。
誰でもこれで私を助けることができますか?深く感謝いたします。ありがとう!
実際に行っている例は投稿されていませんが、ツリー ウィジェットの右下にボタンを付ける方法は次のとおりです。
編集:ツリーの上にウィジェットを合成したいことを確認した後、回答を置き換えました
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())