将QToolButton附加到父QWidget的右下角

时间:2012-06-29 11:40:14

标签: qt pyqt

我遇到了这个问题,并且作为Qt noob我无法修复它。

基本上,我实例化了QToolButton并将其作为QTreeWidget的父级。 QTreeWidget位于垂直布局中,当我尝试使用QTreeWidget更改QTreeWidget.size()内部工具按钮的位置时,会给出非常意外和错误的结果。

任何人都可以帮我吗?将深深体会到帮助。谢谢!

1 个答案:

答案 0 :(得分: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可调用的,由于它处理对象的每个事件,因此被调用了很多次。而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())