【问题标题】:Pyqt4 changing splitter layouts on button pressPyqt4 在按下按钮时更改拆分器布局
【发布时间】:2015-01-02 20:45:45
【问题描述】:

我使用两个拆分器将窗口拆分为三个部分,顶部拆分器上有三个按钮,我希望每次按下按钮时底部拆分器中的布局都会改变,例如当按下添加用户时底部拆分器的布局应该显示一个表单,当按下删除时它应该显示一个列表等等。

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 访问它?那是什么?

【问题讨论】:

    标签: python user-interface pyqt4 qlayout qsplitter


    【解决方案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)
    

    【讨论】:

    • 谢谢!效果很好!!我被困在另一个关于 pyqt qSql 的问题上,我是初学者,所以如果你能让我深入了解这个问题,那将会很有用! stackoverflow.com/questions/27745094/…
    • 恐怕我不知道那个问题的答案,抱歉。
    • 没关系!无论如何谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多