2017-01-23 8 views
0

Ich möchte Splitter verbinden, um einen "Kreuz" Splitter zwischen 4 Widgets zu machen. Ich versuchte es mit Signal und Slot zwischen zwei Splittern, und selbst wenn keine Fehler auftraten, ist das Verhalten nicht das, was ich hoffe (tatsächlich passiert nichts).PyQt4: Connect Splitter

import sys 
from PyQt4 import QtGui, QtCore 

class ApplicationWindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.setAttribute(QtCore.Qt.WA_DeleteOnClose) 
     self.initUI() 

     self.window.setFocus() 
     self.setCentralWidget(self.window) 
     self.showMaximized() 

    def initUI(self) : 
     self.window = QtGui.QWidget() 

     self.editor1 = QtGui.QTextEdit() 
     self.editor2 = QtGui.QTextEdit() 
     self.editor3 = QtGui.QTextEdit() 
     self.editor4 = QtGui.QTextEdit() 

     self.split1 = QtGui.QSplitter() 
     self.split2 = QtGui.QSplitter() 
     self.split3 = QtGui.QSplitter() 
     self.split2.setOrientation(QtCore.Qt.Vertical) 
     self.split3.setOrientation(QtCore.Qt.Vertical) 

     self.split2.addWidget(self.editor1) 
     self.split2.addWidget(self.editor2) 
     self.split3.addWidget(self.editor3) 
     self.split3.addWidget(self.editor4) 

     self.connect(self.split2, QtCore.SIGNAL("splitterMoved"), self.split3.moveSplitter) 
     self.connect(self.split3, QtCore.SIGNAL("splitterMoved"), self.split2.moveSplitter) 

     self.split1.addWidget(self.split2) 
     self.split1.addWidget(self.split3) 

     self.layout = QtGui.QHBoxLayout() 
     self.layout.addWidget(self.split1) 
     self.window.setLayout(self.layout) 

def main() : 
    qApp = QtGui.QApplication(sys.argv) 
    qApp.setStyle('cleanlooks') 
    aw = ApplicationWindow() 
    aw.show() 
    sys.exit(qApp.exec_()) 

if __name__ == '__main__': 
    main() 

Irgendwelche Ideen?

+0

Benötigt '' self.split3.moveSplitter'' keine Argumente ('' QSplitter.moveSplitter (self, int pos, int index) '' von http://pyqt.sourceforge.net/Docs/PyQt4/qsplitter .html # moveSplitter)? Du sagst ihm nicht wohin, oder? – alexblae

+0

Und wie kann ich ihm sagen, wohin er sich bewegen soll? Ich bin hier verloren. – jsgounot

Antwort

0

Ok schließlich fand ich, wie Sie das mit Python:

import sys 
from PyQt4 import QtGui, QtCore 

class ApplicationWindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.setAttribute(QtCore.Qt.WA_DeleteOnClose) 
     self.setWindowTitle("Cluster View") 
     self.initUI() 

     self.window.setFocus() 
     self.setCentralWidget(self.window) 
     self.showMaximized() 

    def splitterMoved(self, sender) : 
     print ("ok", sender) 
     receiver = self.split2 if sender is self.split3 else self.split3 
     receiver.blockSignals(True) 
     receiver.setSizes(sender.sizes()) 
     receiver.blockSignals(False) 

    def initUI(self) : 
     self.window = QtGui.QWidget() 

     self.editor1 = QtGui.QTextEdit() 
     self.editor2 = QtGui.QTextEdit() 
     self.editor3 = QtGui.QTextEdit() 
     self.editor4 = QtGui.QTextEdit() 

     self.split1 = QtGui.QSplitter() 
     self.split2 = QtGui.QSplitter() 
     self.split3 = QtGui.QSplitter() 
     self.split2.setOrientation(QtCore.Qt.Vertical) 
     self.split3.setOrientation(QtCore.Qt.Vertical) 

     self.split2.addWidget(self.editor1) 
     self.split2.addWidget(self.editor2) 
     self.split3.addWidget(self.editor3) 
     self.split3.addWidget(self.editor4) 

     self.connect(self.split2, QtCore.SIGNAL("splitterMoved(int, int)"), lambda x : self.splitterMoved(self.split2)) 
     self.connect(self.split3, QtCore.SIGNAL("splitterMoved(int, int)"), lambda x : self.splitterMoved(self.split3)) 

     self.split1.addWidget(self.split2) 
     self.split1.addWidget(self.split3) 

     self.layout = QtGui.QHBoxLayout() 
     self.layout.addWidget(self.split1) 
     self.window.setLayout(self.layout) 

def main() : 
    qApp = QtGui.QApplication(sys.argv) 
    qApp.setStyle('cleanlooks') 
    aw = ApplicationWindow() 
    aw.show() 
    sys.exit(qApp.exec_()) 

if __name__ == '__main__': 
    main() 

Vielleicht gibt es bessere Art und Weise, das zu tun, aber zumindest funktioniert es jetzt.

+0

Das sieht ziemlich solide aus und macht ziemlich genau das, was ich vorher erwähnt habe, indem ich die beiden "int" mit dem Signal sende. Gut gemacht ;). – alexblae