1

我面临这个问题,作为一个 Qt 菜鸟我​​无法解决它。

基本上,我实例化了 aQToolButton并将其作为QTreeWidget. 这QTreeWidget是在垂直布局中,当我尝试更改使用中工具按钮的位置时,QTreeWidgetQTreeWidget.size()给了我非常意想不到和错误的结果。

谁能帮我这个?将深深感谢您的帮助。谢谢!

4

1 回答 1

3

您还没有发布任何实际操作的示例,但这里是如何将按钮附加到树小部件的右下角:

编辑:看到你想在树上合成小部件后,我已经替换了我的答案

使用事件过滤器

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())  
于 2012-06-30T05:12:03.723 回答