10

スプリッターハンドルの太さと背景画像をカスタマイズできます

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

splitter.setSizes([0, 1])しかし、小さなグラフィカルな矢印ボタンを追加して、ユーザーがクリックしたときに折りたたむように呼び出す方法はありますか。

折りたたみボタン

QButton で vbox レイアウトを使用することもできますが、スペースを取りすぎて見栄えがよくありません。

4

1 に答える 1

14

QSplitterそのcreateHandleメソッドをサブクラス化して再実装できます。これにより、独自のQSplitterHandleクラスのインスタンスを返すことができます。たとえば、再実装されpaintEventた .

または、より簡単に、独自のレイアウトを設定して、既存のスプリッター ハンドルにボタンを直接追加することもできます。

これは、開始するための基本的なデモです (おそらく、見栄えを良くするために微調整が必​​要です)。

PyQt5 :

from PyQt5 import QtCore, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.splitter = QtWidgets.QSplitter(self)
        self.splitter.addWidget(QtWidgets.QTextEdit(self))
        self.splitter.addWidget(QtWidgets.QTextEdit(self))
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.splitter)
        handle = self.splitter.handle(1)
        layout = QtWidgets.QVBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        button = QtWidgets.QToolButton(handle)
        button.setArrowType(QtCore.Qt.LeftArrow)
        button.clicked.connect(
            lambda: self.handleSplitterButton(True))
        layout.addWidget(button)
        button = QtWidgets.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 = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 300, 300)
    window.show()
    sys.exit(app.exec_())

PyQt4 :

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_())
于 2014-02-24T22:48:09.600 に答える