PYQT在多个级别嵌套小部件和布局

2024-05-17 19:45:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我是pyqt的新手,正在尝试创建一组包含控件的嵌套容器。我找不到任何嵌套小部件的示例(并保持它们的布局)。我只能嵌套布局,但这不是我想要实现的。我想这样做的一个原因,是控制我的容器的背景色。由于布局没有颜色,我想我需要QWidgets或qframe。这就是我走过的路:

class AssetCreationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(AssetCreationWindow, self).__init__()
        self.create_content()
        self.show()

    def create_content(self):

    # creating main container-frame, parent it to QWindow
        self.main_CF = QtWidgets.QFrame(self)
        self.main_CF.setStyleSheet('background-color: rgba(255, 0, 0, 1);')
        self.setCentralWidget(self.main_CF)
    # creating layout and parent it to main container
    # is it correct, that main_CL now manages children of main_CF ?
        self.main_CL = QtWidgets.QVBoxLayout(self.main_CF)

    # creating the first subcontainer + layout, parenting it
        asset_CGF = QtWidgets.QFrame(self.main_CF)
        asset_CGF.setStyleSheet('background-color: rgba(0, 255, 0, 1);')
        asset_CGL = QtWidgets.QHBoxLayout(asset_CGF)

    # creating label and lineEdit, both are supposed to be on top of asset_CGF    
        asset_label = QtWidgets.QLabel("Assetname: ", asset_CGF)
        asset_CGL.addWidget(asset_label)
        asset_name = QtWidgets.QLineEdit("MyNewAsset", asset_CGF)
        asset_CGL.addWidget(asset_name)

    # doing the same with a second container
        department_CGF = QtWidgets.QFrame(self.main_CF)
        department_CGF.setStyleSheet('background-color: rgba(0, 0, 255, 1);')
        department_CGL = QtWidgets.QHBoxLayout(department_CGF)

        department_label = QtWidgets.QLabel("Department: ", department_CGF)
        department_CGL.addWidget(department_label)

        department_names = QtWidgets.QComboBox(department_CGF)
        department_CGL.addWidget(department_names)

不幸的是,这种方法将所有窗口小部件堆叠在右上角的彼此上方。另一个方法是从所有布局中删除ParentWidget,除了main_CL并使用addLayout()。

def create_content(self):

    self.main_CF = QtWidgets.QFrame(self)
    self.setCentralWidget(self.main_CF)
    self.main_CL = QtWidgets.QVBoxLayout(self.main_CF)

    asset_CGF = QtWidgets.QFrame(self.main_CF)
    asset_CGF.setStyleSheet('background-color: rgba(255, 0, 0, 1);')
    asset_CGL = QtWidgets.QHBoxLayout()
    self.main_CL.addLayout(asset_CGL)

    asset_label = QtWidgets.QLabel("Asset Name: ", asset_CGF)
    asset_CGL.addWidget(asset_label)
    asset_name = QtWidgets.QLineEdit("MyNewAsset", asset_CGF)
    asset_CGL.addWidget(asset_name)

    department_CGF = QtWidgets.QFrame(self.main_CF)
    department_CGF.setStyleSheet('background-color: rgba(0, 255, 0, 1);')
    department_CGL = QtWidgets.QHBoxLayout()
    self.main_CL.addLayout(department_CGL)

    department_label = QtWidgets.QLabel("Department: ", department_CGF)
    department_CGL.addWidget(department_label)
    department_names = QtWidgets.QComboBox(department_CGF)
    department_CGL.addWidget(department_names)

这在总体上看起来更好,但是子容器布局似乎不知道子容器。即使控制者是子容器的父对象,但控制者不是子容器的本体。子容器再次堆叠在右上角。我已经没有办法了。


Tags: selfclmain布局asset容器labelcf
2条回答

包括AlešErjavecs的答案,这是工作代码示例:

class AssetCreationWindow(QtWidgets.QMainWindow):

def __init__(self, controller):
    super(AssetCreationWindow, self).__init__()
    self.controller = controller
    self.create_content()
    self.show()

def create_content(self):

# creating main container-frame, parent it to QWindow
    self.main_CF = QtWidgets.QFrame(self)
    self.main_CF.setStyleSheet('background-color: rgba(150, 0, 0, 1);')
    self.setCentralWidget(self.main_CF)
# creating layout and parent it to main container
# is it correct, that main_CL now manages children of main_CF ?
    self.main_CL = QtWidgets.QVBoxLayout(self.main_CF)


# creating the first subcontainer + layout, parenting it
    asset_CGF = QtWidgets.QFrame(self.main_CF)
    self.main_CL.addWidget(asset_CGF)
    asset_CGF.setStyleSheet('background-color: rgba(0, 150, 0, 1);')
    asset_CGL = QtWidgets.QHBoxLayout(asset_CGF)

# creating label and lineEdit, both are supposed to be on top of asset_CGF    
    asset_label = QtWidgets.QLabel("Assetname: ", asset_CGF)
    asset_CGL.addWidget(asset_label)
    asset_name = QtWidgets.QLineEdit("MyNewAsset", asset_CGF)
    asset_CGL.addWidget(asset_name)

# doing the same with a second container
    department_CGF = QtWidgets.QFrame(self.main_CF)
    self.main_CL.addWidget(department_CGF)
    department_CGF.setStyleSheet('background-color: rgba(0, 0, 150, 1);')
    department_CGL = QtWidgets.QHBoxLayout(department_CGF)

    department_label = QtWidgets.QLabel("Department: ", department_CGF)
    department_CGL.addWidget(department_label)

    department_names = QtWidgets.QComboBox(department_CGF)
    department_CGL.addWidget(department_names)

结果是:window with nested QWidgets

您必须将布局设置为小部件。E、 克

self.main_CL = QtWidgets.QVBoxLayout()
self.main_CF.setLayout(self.main_CL)

然后显式地将子小部件添加到布局中。E、 g

self.main_CL.addWidget(self.asset_CGF)

对于子组件,遵循相同的模式。

self.asset_CGF.setLayout(self.asset_CGL)
self.asset_CGL.addWidget(...)

实际上,你的第一个例子只遗漏了两个调用

self.main_CL.addWidget(self.asset_CGF)
self.main_CL.addWidget(department_CGF)

相关问题 更多 >