简体   繁体   English

pyside2如何查询、创建和删除动态小部件

[英]pyside2 how to query and create and delete dynamic widget

layout布局

  • layout (1)布局 (1)

    • QlineEdit Qline编辑

    • Qpushbutton Q按钮

  • layout (2)布局 (2)

    • QlineEdit Qline编辑

    • Qpushbutton Q按钮

  • Qpushbutton (3) Q按钮 (3)

I try to create and delete layout(1,2) in layout.我尝试在布局中创建和删除布局(1,2)。

it's work real time.这是实时工作。 layout(1,2) are dynamic number (1,2,3,~~) layout(1,2) 是动态数 (1,2,3,~~)

Qpushbutton click -> parent layout and widget delete Qpushbutton 单击 -> 父布局和小部件删除

and query text in QlineEdit并在 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_())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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