简体   繁体   中英

pyside2 how to query and create and delete dynamic widget

layout

  • layout (1)

    • QlineEdit

    • Qpushbutton

  • layout (2)

    • QlineEdit

    • Qpushbutton

  • Qpushbutton (3)

I try to create and delete layout(1,2) in layout.

it's work real time. layout(1,2) are dynamic number (1,2,3,~~)

Qpushbutton click -> parent layout and widget delete

and query text in QlineEdit

my test code --

#-*- 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()

在此处输入图片说明

I want

  1. add path line

  2. delete path line

  3. query departmentNameLine, departmentPathLine text

i try ↑, but fail

i try in maya

To keep the logic tidy I have created a class that represents a row, then store the rows in a list to get the texts or to delete the row as I show below:

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_())

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM