【问题标题】:pyqt qt4 How to add a tiny arrow/collapse button to QSplitterpyqt qt4 如何向 QSplitter 添加一个小箭头/折叠按钮
【发布时间】:2014-03-26 15:59:27
【问题描述】:

您可以自定义分割手柄的粗细和背景图片

http://qt-project.org/doc/qt-4.8/stylesheet-examples.html#customizing-qsplitter

但是有没有办法添加一个小的图形箭头按钮,这样当用户点击它时,我可以调用splitter.setSizes([0, 1]) 来折叠它。

我可以使用带有 QButton 的 vbox 布局,但它占用了太多空间并且看起来不太好。

【问题讨论】:

    标签: qt qt4 pyqt pyqt4 qsplitter


    【解决方案1】:

    您可以继承 QSplitter 并重新实现其 createHandle 方法。这将允许您返回您自己的 QSplitterHandle 类的实例,例如重新实现的 paintEvent

    另外,更简单的是,您可以通过在现有拆分器句柄上设置自己的布局来直接将按钮添加到它。

    这是一个基本演示,可帮助您入门(可能需要进行一些调整以使其更漂亮):

    from PyQt4 import QtCore, QtGui
    
    class Window(QtGui.QWidget):
        def __init__(self):
            QtGui.QWidget.__init__(self)
            self.splitter = QtGui.QSplitter(self)
            self.splitter.addWidget(QtGui.QTextEdit(self))
            self.splitter.addWidget(QtGui.QTextEdit(self))
            layout = QtGui.QVBoxLayout(self)
            layout.addWidget(self.splitter)
            handle = self.splitter.handle(1)
            layout = QtGui.QVBoxLayout()
            layout.setContentsMargins(0, 0, 0, 0)
            button = QtGui.QToolButton(handle)
            button.setArrowType(QtCore.Qt.LeftArrow)
            button.clicked.connect(
                lambda: self.handleSplitterButton(True))
            layout.addWidget(button)
            button = QtGui.QToolButton(handle)
            button.setArrowType(QtCore.Qt.RightArrow)
            button.clicked.connect(
                lambda: self.handleSplitterButton(False))
            layout.addWidget(button)
            handle.setLayout(layout)
    
        def handleSplitterButton(self, left=True):
            if not all(self.splitter.sizes()):
                self.splitter.setSizes([1, 1])
            elif left:
                self.splitter.setSizes([0, 1])
            else:
                self.splitter.setSizes([1, 0])
    
    if __name__ == '__main__':
    
        import sys
        app = QtGui.QApplication(sys.argv)
        window = Window()
        window.setGeometry(500, 300, 300, 300)
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 你是真正的 qt 忍者。我不知道您可以将带有额外按钮的布局强制到现有句柄中,并且没有 setContentsMargins(0,0,0,0) 什么都不会显示。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多