2014-02-24 259 views

回答

10

您可以繼承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_()) 
+2

你是一個真正的忍者QT。我不知道你可以強制一個帶有額外按鈕的佈局到現有的句柄中,而沒有setContentsMargins(0,0,0,0)什麼都不會顯示。 再次感謝 – user178047