Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将QToolButton附加到父QWidget的右下角_Qt_Pyqt - Fatal编程技术网

将QToolButton附加到父QWidget的右下角

将QToolButton附加到父QWidget的右下角,qt,pyqt,Qt,Pyqt,我面临着这个问题,作为一个Qt noob,我无法解决它 基本上,我实例化了一个QToolButton,并将其作为QTreeWidget的父对象。QTreeWidget位于垂直布局内,当我尝试使用QTreeWidget.size()更改QTreeWidget内工具按钮的位置时,它会给出非常意外和错误的结果 有人能帮我吗?我将非常感谢您的帮助。谢谢 您还没有发布任何实际操作的示例,但下面是如何将按钮附加到树小部件的右下角: 编辑:在看到您想要在树上合成小部件后,我已经替换了我的答案 使用事件过滤器

我面临着这个问题,作为一个Qt noob,我无法解决它

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


有人能帮我吗?我将非常感谢您的帮助。谢谢

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

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

使用事件过滤器 该按钮只是树的父级,我们在树上安装事件过滤器以捕获调整大小事件。调整树的大小后,我们将取其大小,减去按钮的大小,然后移动按钮

使用构图 我认为更有效的方法是对QTreeWidget进行子类化,将QToolButton作为成员组合,然后在本地重载
resizeEvent()
来处理resize。首先,这会使行为处理成为TreeWidget的本地处理,这会更干净。此外,我相信它减少了EventFilter添加到主窗口的开销。eventFiler将是一个python可调用程序,它会被多次调用,因为它处理对象的每个事件。而TreeWidget的local 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())  

你能描述一下结果应该是什么样的吗?按钮是否应始终位于QTreeWidget的左上角?首先,很抱歉标题错误。这不是一个QDockWidget,而是一个QToolButton。我希望一个按钮始终位于树小部件的右下角。在调整窗口大小后,我将应用事件过滤器对其进行相应的定位。但由于我的树小部件位于垂直布局内,因此查询树小部件的大小并不能给出正确的结果。所以我无法相应地移动我的按钮。谢谢:)很抱歉我自己没有这样做。但是,有没有办法把它放在那里呢?你能用
size()
发布你尝试过的代码吗?您是如何处理调整大小事件的?我知道的方法是对要处理并覆盖此事件的小部件进行子分类(
resizeEvent(…)
),我认为OP希望树小部件上的按钮(位于右下角),而不是在下面。@Avaris:谢谢您指出这一点。将我的示例替换为在右下角的树小部件上放置按钮的示例。
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())