2017-01-23 5 views
0

Я хочу подключить сплиттеры, чтобы сделать «кросс» разветвитель между 4 виджетами. Я пытался это сделать, используя сигнал и слот между двумя разветвителями, и даже если ошибок не было, поведение не такое, на что я надеюсь (на самом деле ничего не происходит).PyQt4: подключить сплиттер

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() 

Любые идеи?

+0

Не нужны аргументы '' self.split3.moveSplitter'' '' QSplitter.moveSplitter (self, int pos, int index) '' из http://pyqt.sourceforge.net/Docs/PyQt4/qsplitter .html # moveSplitter)? Вы не говорите, куда двигаться, не так ли? – alexblae

+0

И как я могу сказать ему, куда двигаться? Я здесь потерялся. – jsgounot

ответ

0

Ok, наконец, я нашел, как это сделать с помощью питона:

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() 

Может быть, есть лучший способ сделать это, но, по крайней мере, в настоящее время работает.

+0

Это выглядит довольно солидно и делает то, что я упоминал ранее, отправив два '' int'' с сигналом. Отлично сработано ;). – alexblae

Смежные вопросы