加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:03:33 所属栏目:Python 来源:网络整理
导读:我是pyqt的新手并试图创建一组嵌套容器来保存我的控件.我找不到任何嵌套小部件的例子(并保持它们的布局).我只能嵌套布局,但这不是我想要实现的.我想这样做的一个原因是对我的容器的backgroundcolor进行控制.由于布局没有颜色,我想我需要QWidgets或QFrame.这
我是pyqt的新手并试图创建一组嵌套容器来保存我的控件.我找不到任何嵌套小部件的例子(并保持它们的布局).我只能嵌套布局,但这不是我想要实现的.我想这样做的一个原因是对我的容器的backgroundcolor进行控制.由于布局没有颜色,我想我需要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,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,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,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)

不幸的是,这种方法将右上角的所有小部件堆叠在一起.另一个是从除main_CL之外的所有布局中删除ParentWidget并使用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,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,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)

这一般看起来更好,但子容器布局似乎不知道子容器.即使控制器是子集装箱的主体,控制器也不在副集装箱的顶端.子容器再次堆叠在右上角.我没办法.

解决方法

您必须将布局设置为窗口小部件.例如

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

然后显式地将子窗口小部件添加到布局中.例如.

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读