pyside2如何查询以及创建和删除动态窗口小部件

问题描述 投票:0回答:1

布局

  • 布局(1)

    • QlineEdit

    • Qpushbutton

  • 布局(2)

    • QlineEdit

    • Qpushbutton

  • Qpushbutton(3)

我尝试在布局中创建和删除layout(1,2)。

它是实时工作。 layout(1,2)是动态数字(1,2,3,~~)

Qpushbutton单击->父布局和小部件删除

并在QlineEdit中查询文本

我的测试代码-

#-*- coding:utf-8 -*-

import maya.cmds as mc
import os
import pprint

from PySide2 import QtWidgets, QtCore, QtGui

class PreferenceUI(QtWidgets.QDialog):

    def __init__(self):
        super(PreferenceUI, self).__init__()

        self.setWindowTitle("preference")
        self.create_widgets()
        self.create_layouts()
        self.create_connections()
        self.load_department()

    def create_widgets(self):
        self.departmentNameLine = QtWidgets.QLineEdit()
        self.departmentNameLine.setFixedSize(100,20)
        self.departmentPathLine = QtWidgets.QLineEdit()
        self.departmentMinusBtn = QtWidgets.QPushButton("-")
        self.departmentMinusBtn.setFixedSize(20,20)

        self.departmentPlusBtn = QtWidgets.QPushButton("+")

        self.sysAppendWidget = QtWidgets.QTextEdit()

    def create_layouts(self):
        self.mainLayout = QtWidgets.QFormLayout(self)
        self.departmentLayout = QtWidgets.QVBoxLayout()

        self.departmentLastLayout = QtWidgets.QHBoxLayout()
        self.departmentLayout.addLayout(self.departmentLastLayout)
        self.departmentLayout.addWidget(self.departmentPlusBtn)

        self.mainLayout.addRow("department :", self.departmentLayout)
        self.mainLayout.insertRow(self.mainLayout.count()-1, "sys.path.append :", self.sysAppendWidget)

    def create_connections(self):
        pass

    def load_department(self):
        self.departmentPlusBtn.setParent(None)

        jsonDict = {"department": [["temp", "tempPath"], ["temp2", "temp2Path"]]}
        for i in range(len(jsonDict["department"])):
            layout = QtWidgets.QHBoxLayout()
            self.departmentLayout.addLayout(layout)

            departmentNameLine = QtWidgets.QLineEdit()
            departmentNameLine.setText(jsonDict["department"][i][0])
            departmentNameLine.setFixedSize(100,20)

            departmentPathLine = QtWidgets.QLineEdit()
            departmentPathLine.setText(jsonDict["department"][i][1])

            departmentMinusBtn = QtWidgets.QPushButton("-")
            departmentMinusBtn.setFixedSize(20,20)
            cnt = self.departmentLayout.count()
            departmentMinusBtn.clicked.connect(lambda x:self.remove_department(cnt))

            layout.addWidget(departmentNameLine)
            layout.addWidget(departmentPathLine)
            layout.addWidget(departmentMinusBtn)
        self.departmentLayout.insertWidget(self.departmentLayout.count(), self.departmentPlusBtn)

    def remove_department(self, index):
        print index
        print self.departmentLayout.children()[0].layout().children()

if __name__ == "__main__":
    try:
        ui.close
    except:
        pass
    ui = PreferenceUI()
    ui.show()

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS96RFRwcS5wbmcifQ==” alt =“在此处输入图像描述”>

我想要

  1. 添加路径行

  2. 删除路径行

  3. 查询departmentNameLine,departmentPathLine文本

我尝试↑,但失败

我尝试Maya

python pyside2
1个回答
0
投票

为了保持逻辑整洁,我创建了一个代表行的类,然后将这些行存储在列表中以获取文本或删除行,如下所示:

from functools import partial

from PySide2 import QtWidgets, QtCore, QtGui


class Widget(QtWidgets.QWidget):
    def __init__(self, text1, text2, parent=None):
        super().__init__(parent)
        self.departmentNameLine = QtWidgets.QLineEdit(text1)
        self.departmentNameLine.setFixedSize(100, 20)
        self.departmentPathLine = QtWidgets.QLineEdit(text2)
        self.departmentMinusBtn = QtWidgets.QPushButton("-")
        self.departmentMinusBtn.setFixedSize(20, 20)
        self.setContentsMargins(0, 0, 0, 0)
        layout = QtWidgets.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.departmentNameLine)
        layout.addWidget(self.departmentPathLine)
        layout.addWidget(self.departmentMinusBtn)


class PreferenceUI(QtWidgets.QDialog):
    def __init__(self):
        super(PreferenceUI, self).__init__()

        self.widgets = []

        self.setWindowTitle("preference")
        self.create_widgets()
        self.create_layouts()
        self.create_connections()
        self.load_department()

    def create_widgets(self):
        self.departmentPlusBtn = QtWidgets.QPushButton("+")
        self.sysAppendWidget = QtWidgets.QTextEdit()

    def create_layouts(self):
        self.mainLayout = QtWidgets.QFormLayout(self)
        self.departmentLayout = QtWidgets.QVBoxLayout()

        self.departmentLastLayout = QtWidgets.QHBoxLayout()
        self.departmentLayout.addLayout(self.departmentLastLayout)
        self.departmentLayout.addWidget(self.departmentPlusBtn)

        self.mainLayout.addRow("department :", self.departmentLayout)
        self.mainLayout.insertRow(
            self.mainLayout.count() - 1, "sys.path.append :", self.sysAppendWidget
        )

    def create_connections(self):
        self.departmentPlusBtn.clicked.connect(self.add_row)

    def load_department(self):
        jsonDict = {"department": [["temp", "tempPath"], ["temp2", "temp2Path"]]}
        for text1, text2 in jsonDict["department"]:
            self.create_row(text1, text2)

    def save_departament(self):
        l = []
        for widget in self.widgets:
            l.append([self.departmentNameLine.text(), self.departmentPathLine.text()])
        jsonDict = {"department": l}
        print(jsonDict)

    def add_row(self):
        self.create_row("text1", "text2")

    def create_row(self, text1="", text2=""):
        widget = Widget(text1, text2)
        widget.departmentMinusBtn.clicked.connect(partial(self.delete, widget))
        self.departmentLayout.addWidget(widget)
        self.widgets.append(widget)

    def delete(self, widget):
        if widget in self.widgets:
            self.widgets.remove(widget)
        widget.deleteLater()


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = PreferenceUI()
    w.show()

    sys.exit(app.exec_())
© www.soinside.com 2019 - 2024. All rights reserved.