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'

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


person Inthu    schedule 02.01.2015    source источник


Ответы (1)


На самом деле проблема здесь вызвана методом 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)
person Blackbeard    schedule 02.01.2015
comment
Спасибо! Это сработало отлично!! Я застрял на другом вопросе, касающемся pyqt qSql, я новичок, поэтому, если бы вы могли дать мне представление об этом вопросе, это было бы полезно! stackoverflow.com/questions/27745094/ - person Inthu; 03.01.2015
comment
Боюсь, я не знаю ответа на этот вопрос, извините. - person Blackbeard; 03.01.2015
comment
Это нормально! Спасибо, в любом случае :) - person Inthu; 03.01.2015