2014-02-24 3 views
9

Sie können die Dicke und Hintergrund anpassen Bild des Splitters Griffpyqt qt4 Wie eine winzige Pfeil/Zusammenbruch-Taste, um in der QSplitter

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

Aber gibt es eine Möglichkeit, eine kleine grafische Pfeiltaste so hinzufügen Wenn der Benutzer darauf klickt, kann ich splitter.setSizes([0, 1]) aufrufen, um es zu reduzieren.

collapsebutton

Ich könnte ein vbox Layout mit einem QButton verwenden, aber es nimmt zu viel Platz in Anspruch und sieht nicht so schön.

Antwort

10

Sie könnten Unterklasse QSplitter und Reimplementierung seiner createHandle Methode. Dies würde es Ihnen ermöglichen, eine Instanz Ihrer eigenen QSplitterHandle Klasse zurückzugeben, mit, sagen wir, eine neu implementierte paintEvent.

Alternativ und einfacher können Sie Schaltflächen direkt zu einem vorhandenen Splitter-Handle hinzufügen, indem Sie ein eigenes Layout festlegen.

Hier ist eine grundlegende Demo Sie beginnen (wahrscheinlich einige Optimierungen muss es schönere machen):

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_()) 
+2

Du bist wirklich ein qt Ninja. Ich habe keine Ahnung, dass man ein Layout mit zusätzlichen Buttons in ein bestehendes Handle zwingen kann und ohne setContentsMargins (0,0,0,0) wird nichts angezeigt. Danke nochmal – user178047