2017-01-23 56 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)''from http://pyqt.sourceforge.net/Docs/PyQt4/qsplitter .html#moveSplitter)?你没有告诉它在哪里移动,对吧? – alexblae

+0

我该如何告诉他在哪里移动?我迷失在这里。 – jsgounot

回答

0

好了终于让我找到怎么说使用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() 

也许有更好的方式来做到这一点,但至少现在的工作。

+0

这看起来很稳固,并且几乎完成了我之前提到的通过发送两个“int”与信号。做得好 ;)。 – alexblae