2015-01-02 9 views
0

Я использовал два разветвителя, чтобы проливать окно на три секции, на верхнем разделителе есть три кнопки, и я хочу, чтобы макет в нижнем сплиттере менялся каждый раз при нажатии кнопки, поэтому для Например, когда пользователь добавляется, макет нижнего сплиттера должен показывать форму, а при удалении - он должен отображать список и так далее.Pyqt4 смену расщепителей на кнопке

from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 

    def __init__(self): 
     super().__init__() 
     self.initUI() 

    def initUI(self):  

     vbox = QtGui.QVBoxLayout(self) 

     topleft = QtGui.QFrame(self) 
     topleft.setFrameShape(QtGui.QFrame.StyledPanel) 

     bottomleft = QtGui.QFrame(self) 
     bottomleft.setFrameShape(QtGui.QFrame.StyledPanel) 

     right = QtGui.QFrame(self) 
     right.setFrameShape(QtGui.QFrame.StyledPanel) 

     splitterV = QtGui.QSplitter(QtCore.Qt.Vertical) 
     splitterV.addWidget(topleft) 
     splitterV.addWidget(bottomleft) 

     splitterH = QtGui.QSplitter(QtCore.Qt.Horizontal) 
     splitterH.addWidget(splitterV) 
     splitterH.addWidget(right) 

     vbox.addWidget(splitterH) 
     self.setLayout(vbox) 
     splitterV.setSizes([100,620]) 
     splitterH.setSizes([960,360]) 

     ##Layout for the top left of the splitter   
     addUserButton = QtGui.QPushButton('Add New User') 
     addUserButton.clicked.connect(self.addNewUser) 
     deleteUserButton = QtGui.QPushButton('Delete User') 
     deleteUserButton.clicked.connect(self.deleteUser) 
     editUserButton = QtGui.QPushButton('Edit User') 
     editUserButton.clicked.connect(self.editUser) 
     topLayout = QtGui.QHBoxLayout() 
     topLayout.addWidget(addUserButton) 
     topLayout.addWidget(deleteUserButton) 
     topLayout.addWidget(editUserButton) 
     topleft.setLayout(topLayout) 

     QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Plastique'))  

    def addNewUser(self): 
     ##Layout for the bottom left of the splitter when button pressed 
     lbl1 = QtGui.QLabel('First Name') 
     lbl2 = QtGui.QLabel('Last Name') 

     fname = QtGui.QLineEdit() 
     lname = QtGui.QLineEdit() 


     grid = QtGui.QGridLayout() 
     grid.setSpacing(10) 

     grid.addWidget(lbl1, 1, 0) 
     grid.addWidget(fname, 1, 1) 
     grid.addWidget(lbl2, 2, 0) 
     grid.addWidget(lname, 2, 1) 

     self.bottomleft.setLayout(grid) 

    def deleteUser(self): 
     print('Delete') 
    def editUser(self): 
     print('Edit') 

if __name__ == '__main__': 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 

Я пробовал много разных способов, но все же не могу заставить его работать над любыми идеями? Я застрял прямо сейчас с этой ошибкой при нажатии кнопки добавить пользователя:

Traceback (most recent call last): 
    File "C:\Users\Program\Test\SettingsTab.py", line 81, in addNewUser 
    self.bottomleft.setLayout(grid) 
AttributeError: 'Window' object has no attribute 'bottomleft' 

Я не уверен, как получить доступ к нижнему левому расположению окна и изменить его для каждого нажатия клавиши, потому что я не могу получить доступ к нему используя self, если это не атрибут? тогда что это?

ответ

2

Это действительно метод initUI, который вызывает здесь проблему - вы не определили переменные как переменные класса, они специфичны для метода, поэтому метод addNewUser не может их видеть.

topleft = QtGui.QFrame(self) 
topleft.setFrameShape(QtGui.QFrame.StyledPanel) 

bottomleft = QtGui.QFrame(self) 
bottomleft.setFrameShape(QtGui.QFrame.StyledPanel) 

right = QtGui.QFrame(self) 
right.setFrameShape(QtGui.QFrame.StyledPanel) 

следует читать:

self.topleft = QtGui.QFrame(self) 
self.topleft.setFrameShape(QtGui.QFrame.StyledPanel) 

self.bottomleft = QtGui.QFrame(self) 
self.bottomleft.setFrameShape(QtGui.QFrame.StyledPanel) 

self.right = QtGui.QFrame(self) 
self.right.setFrameShape(QtGui.QFrame.StyledPanel) 
+0

Спасибо! Это сработало отлично! Я застрял в другом вопросе, это о pyqt qSql, я новичок, поэтому, если бы вы могли дать мне понять этот вопрос, это было бы полезно! http://stackoverflow.com/questions/27745094/pyqt4-qsql-how-to-get-data-from-a-relational-database-and-display-them – Inthuson

+0

Боюсь, я не знаю ответа на это один, извините. – Blackbeard

+0

Все в порядке! Спасибо, в любом случае :) – Inthuson