Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 保存Qtreewidget项并使用所选内容将其还原_Python_Pyqt_Pyqt5_Qtreewidget_Qsettings - Fatal编程技术网

Python 保存Qtreewidget项并使用所选内容将其还原

Python 保存Qtreewidget项并使用所选内容将其还原,python,pyqt,pyqt5,qtreewidget,qsettings,Python,Pyqt,Pyqt5,Qtreewidget,Qsettings,我需要Qwidget和QTreeWidget支持我的小软件。见下图 这就是我的Qwidget的样子。我想在关闭窗口并使用以前的选择还原它时还原Qtreewidget项目和widget。如下图所示。正如您在我下面的脚本中所看到的,我使用了Qsettings,我尝试用pickle修复它,但不起作用 编码方面的任何改进都是值得欢迎的 from PyQt5 import * from PyQt5.QtWidgets import * from PyQt5.QtCore import* from Py

我需要Qwidget和QTreeWidget支持我的小软件。见下图

这就是我的Qwidget的样子。我想在关闭窗口并使用以前的选择还原它时还原Qtreewidget项目和widget。如下图所示。正如您在我下面的脚本中所看到的,我使用了Qsettings,我尝试用pickle修复它,但不起作用

编码方面的任何改进都是值得欢迎的

from PyQt5 import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import*
from PyQt5.QtGui import *
import sys
import pickle

iconroot = QFileInfo(__file__).absolutePath()
ORGANIZATION_NAME = 'Circularcolumn App'
ORGANIZATION_DOMAIN = 'Circular shape'
APPLICATION_NAME = 'QSettings program'
SETTINGS_TRAY = 'settings/tray'

class usedcircularshape(QDialog):
    def __init__(self, parent=None):
    super().__init__(parent)

    self.setWindowTitle("Frequently used shape")
    self.setWindowIcon(QIcon(iconroot+"/images/circularcolumnnorebar.png"))
    #self.setStyleSheet("background-color:#f2f2f2")

    self.addbutton = QPushButton("Add")
    self.addbutton.clicked.connect(self.add)
    self.deletebutton = QPushButton("Delete")
    self.deletebutton.clicked.connect(self.delete)

    self.okbutton = QPushButton("Ok")
    self.okbutton.setCursor(Qt.PointingHandCursor)
    #self.okbutton.clicked.connect(self.hidethiswindow)
    self.okbutton.clicked.connect(self.savesetting)

    self.cancelbutton = QPushButton("Cancel")
    self.cancelbutton.setCursor(Qt.PointingHandCursor)
    self.cancelbutton.clicked.connect(self.loadsetting)
    #self.cancelbutton.clicked.connect(self.close)

    self.addimage()
    self.qlabeltodefinesection()
    self.treewidget()

    self.sectionnamecircular = QLabel('Section name: ')
    self.sectionnamecircularindata = QLineEdit('Define en name to section')
    self.sectionnamecircularindata.setObjectName("sectionnamecircularindata")
    self.sectionnamecircular.setBuddy(self.sectionnamecircularindata)
    self.sectionnamecircular.setFocus()
    self.grid_sectionname = QHBoxLayout()
    self.grid_sectionname.addWidget(self.sectionnamecircular)
    self.grid_sectionname.addWidget(self.sectionnamecircularindata)

    self.boxlayout = QGridLayout()
    self.boxlayout.addLayout(self.grid_sectionname,0,0,1,2)
    self.boxlayout.addWidget(self.treewidget,1,0,5,2)
    self.boxlayout.addWidget(self.addbutton,2,2)
    self.boxlayout.addWidget(self.deletebutton,3,2)
    self.boxlayout.addWidget(self.imagelabel,6,0)
    self.boxlayout.addLayout(self.qlabelhboxgrid ,6,1)
    self.boxlayout.addWidget(self.okbutton,8,1)
    self.boxlayout.addWidget(self.cancelbutton,8,2)
    self.setLayout(self.boxlayout)
    try:
        self.loadsetting()
    except ( ValueError, TypeError):
        pass

def treewidget(self):
    self.treewidget = QTreeWidget(self)
    self.treewidget.setColumnCount(1)
    self.treewidget.setColumnWidth(1,20)
    self.treewidget.setHeaderItem(QTreeWidgetItem(['Standard Section Library']))
    #self.treewidget.addTopLevelItem(QTreeWidgetItem(['Standard Sectiontype']))
    self.treewidget.setRootIsDecorated(True)

    self.firstparentitem = QTreeWidgetItem(self.treewidget)
    self.firstparentitem.setText(0,'Circular shapes')
    self.firstparentitem.setIcon(0,QIcon(iconroot+"/images/circularcolumnnorebar.png"))

    standardsectionlist = ["D100","D150","D200","D250","D300","D350","D400","D450","D500","D550","D600","D650"
                           ,"D700","D750","D800","D850","D900","D950","D1000"]

    for i in standardsectionlist:
        self.firstparentitem.addChild(QTreeWidgetItem(["%s"%i]))

    self.secondparentitem = QTreeWidgetItem(self.treewidget)
    self.secondparentitem.setText(0,'Customized')
    self.secondparentitem.setIcon(0,QIcon(iconroot+"/images/circularcolumnnorebar.png"))    
    self.secondchilditem = QTreeWidgetItem(["D235"])    
    self.secondparentitem.insertChild(0,self.secondchilditem)
    self.secondchilditem.setChildIndicatorPolicy(QTreeWidgetItem.DontShowIndicator)
    self.treewidget.move(15,15)
    self.treewidget.setGeometry(15,15,200,600)
    self.treewidget.setAlternatingRowColors(True)
    self.treewidget.expandItem ( self.firstparentitem )
    self.show() 

    print(self.treewidget.headerItem().text(0))
    print(self.treewidget.columnCount())
    print(self.treewidget.currentColumn())

    print(self.treewidget.indexFromItem(self.firstparentitem).row())
    print(self.firstparentitem.childCount())
    print(self.firstparentitem.child(1).text(0))
    print(self.firstparentitem.text(0))
    print(self.treewidget.headerItem().text(0))
    print(self.treewidget.topLevelItem(0).text(0))
    print(self.firstparentitem.isSelected())
    print(self.treewidget.selectedItems())
    print(self.secondchilditem.text(1))

    branchstyle = '''QTreeWidget {border:none;} 

    QTreeView::branch:has-siblings:!adjoins-item {
        border-image: url(images/vline.png) 0;}

    QTreeView::branch:has-siblings:adjoins-item {
        border-image: url(images/branch-more.png) 0;}

    QTreeView::branch:!has-children:!has-siblings:adjoins-item {
        border-image: url(images/branch-end.png) 0;}

    QTreeView::branch:has-children:!has-siblings:closed,
    QTreeView::branch:closed:has-children:has-siblings {
        border-image: none;
        image: url(images/branch-closed.png);}

    QTreeView::branch:open:has-children:!has-siblings,
    QTreeView::branch:open:has-children:has-siblings {
        border-image: none;
        image: url(images/branch-open.png);}'''

    self.treewidget.setStyleSheet(branchstyle)
    self.treewidget.itemClicked.connect(self.currentitem)
    self.treewidget.currentItemChanged.connect(self.current_item_changed)

   #@QtCore.pyqtSlot(QtWidgets.QTreeWidgetItem, QtWidgets.QTreeWidgetItem)
def current_item_changed(self, current, previous):
   #print('\ncurrent: {}, \nprevious: {}'.format(current, previous))
    print(current.text(0),previous)


def add(self):
    text, ok = QInputDialog.getText(self, "Add custom section", "Enter section geometry f.ex as D325 or just 325 in mm: ")

    if ok:
        self.secondchilditem = QTreeWidgetItem(["%s"% text])
        self.secondparentitem.insertChild(0,self.secondchilditem)
        self.treewidget.expandItem ( self.secondparentitem )
        self.gettext = text

    print(self.secondparentitem.child(0), self.gettext)


def delete(self):
    self.secondparentitem.takeChild(0)

def currentitem(self):
    print(self.treewidget.currentItem().text(0),self.treewidget.selectedItems())
    self.itemtext = self.treewidget.currentItem().text(0)

    if self.itemtext == self.firstparentitem.text(0) or self.itemtext == self.secondparentitem.text(0):
        return None
    elif self.itemtext == self.treewidget.topLevelItem(0).text(0):
        return None
    elif self.itemtext == None:
        return None
    else:
        self.select_circular_section = int(self.itemtext.translate({ord('D'):None}))   
        print(self.itemtext, self.treewidget.selectedItems, self.select_circular_section)

        area = str(format(3.1416/4*(self.select_circular_section)**2,'0.2E'))
        inerti = str(format(3.1416/64*pow(self.select_circular_section,4),'0.2E'))

        self.qlabelcirculardiameterselected = QLabel('')
        qlabelcircularareaselected = QLabel('')
        qlabelcircularinertimomentselected = QLabel("")
        emptylabel1 = QLabel('     ')

        self.qlabelcirculardiameterselected.setText('%s    mm '% self.select_circular_section)
        qlabelcircularareaselected.setText('{}    mm2 ' .format(area))
        qlabelcircularinertimomentselected.setText("%s    mm4 " %(inerti))

        qlabelhboxgridselected = QGridLayout()
        qlabelhboxgridselected.addWidget(emptylabel1,0,0)
        qlabelhboxgridselected.addWidget(self.qlabelcirculardiameterselected,1,0)
        qlabelhboxgridselected.addWidget(qlabelcircularareaselected,2,0)
        qlabelhboxgridselected.addWidget(qlabelcircularinertimomentselected,3,0)
        qlabelhboxgridselected.addWidget(emptylabel1,4,0,5,0)       

        return print(self.itemtext, self.treewidget.selectedItems, self.select_circular_section), self.boxlayout.addLayout(qlabelhboxgridselected ,6,2),self.qlabelcirculardiameterselected     

def addimage(self):
    self.imagelabel = QLabel()
    self.circularimage = QPixmap(iconroot+"/images/circularcolumnnorebard.png").scaled(230,230,Qt.KeepAspectRatio)
    self.imagelabel.setPixmap(self.circularimage) 
    self.imagelabel.setGeometry(15,15,15,15)

def hidethiswindow(self):   
    if self.itemtext == self.firstparentitem.text(0) or self.itemtext == self.secondparentitem.text(0):
        QMessageBox.about(self,'Error selection','Please, select a section not a text')
    elif self.itemtext == self.treewidget.topLevelItem(0).text(0):
        QMessageBox.about(self,'Error selection','Please, select a section not a text')
    elif self.itemtext == None:
        QMessageBox.about(self,'Error selection','Please, select a section not a text')
    else:
        self.savesetting()
        self.hide() 

def qlabeltodefinesection(self):    
    self.qlabelcirculardiameter = QLabel('    D = ')
    self.qlabelcirculararea = QLabel('    A = ')
    self.qlabelcircularinertimoment = QLabel("    I = ")
    self.emptylabel = QLabel('     ')   
    self.qlabelhboxgrid = QGridLayout()
    self.qlabelhboxgrid.addWidget(self.emptylabel,0,0)
    self.qlabelhboxgrid.addWidget(self.qlabelcirculardiameter,1,0)
    self.qlabelhboxgrid.addWidget(self.qlabelcirculararea,2,0)
    self.qlabelhboxgrid.addWidget(self.qlabelcircularinertimoment,3,0)
    self.qlabelhboxgrid.addWidget(self.emptylabel,4,0,5,0)


def savesetting(self):
    settings = QSettings(ORGANIZATION_NAME,APPLICATION_NAME)
    #settings = QSettings('config.ini',QSettings.IniFormat)
    settings.beginGroup('D')
    settings.setValue(SETTINGS_TRAY,self.geometry())
    settings.setValue("LineEdit",self.sectionnamecircularindata.text())
    settings.setValue("Selectitem",self.treewidget.currentItem())
    settings.setValue("Label",self.qlabelcirculardiameterselected)
    settings.endGroup()
    print('Saved', )
    #self.hide()   

def loadsetting(self):
    settings = QSettings(ORGANIZATION_NAME,APPLICATION_NAME)
    #settings = QSettings('config.ini',QSettings.IniFormat)
    settings.beginGroup('D')
    myrect = settings.value(SETTINGS_TRAY)
    restorelineEdit = settings.value("LineEdit",'')
    restoreselectsection = settings.value("Selectitem",)
    restoreqlabel =  settings.value("Label",'')
    self.setGeometry(myrect)
    self.sectionnamecircularindata.setText(restorelineEdit)
    self.treewidget.setCurrentItem(restoreselectsection)
    settings.endGroup()        

if __name__ == "__main__":

QCoreApplication.setApplicationName(ORGANIZATION_NAME)
QCoreApplication.setOrganizationDomain(ORGANIZATION_DOMAIN)
QCoreApplication.setApplicationName(APPLICATION_NAME)

app = QApplication(sys.argv)
subwindow=usedcircularshape()
subwindow.show()
app.exec()
代码的作用是什么

这是一个工程软件,对于混凝土柱,用户应该能够选择标准截面,例如D350,D表示直径,350表示圆形混凝土柱的直径,单位为mm。 用户可以添加自定义形状的圆柱。当用户单击并从一个部分中选择时,该部分应保持全局,以供进一步计算,但未显示。这是一个在大型混凝土软件中定义几何体的小部件。 下面我将进一步解释代码。 首先,我创建Qdialog和Qtreewidget,这是一个用于澄清的图像和基于项目选择的Qlabel。 在Qtreewidget中,我首先创建一个parentitem,并给它命名为“圆形”

self.firstparentitem = QTreeWidgetItem(self.treewidget)
self.firstparentitem.setText(0,'Circular shapes')
然后parentitem有子项,要定义和添加这些子项,首先我创建一个包含标准节的列表

    standardsectionlist = ["D100","D150","D200","D250","D300","D350","D400","D450","D500","D550","D600","D650"
                       ,"D700","D750","D800","D850","D900","D950","D1000"]
和执行条件以将子项添加到parentitem

    for i in standardsectionlist:
    self.firstparentitem.addChild(QTreeWidgetItem(["%s"%i]))
后来我定义了SecondParentItem,并给出了一个名称“Customized”,定义了一个列表,然后将列表中的项作为子项添加到SecondParentItem中。 对于用户,应该能够从第二个parentitem中添加和删除childitem I创建2个按钮

self.addbutton = QPushButton("Add")
self.deletebutton = QPushButton("Delete")
Addbutton具有将子项添加到第二个父项的功能。 Deletebutton具有从第二个parentitem中删除第一个子项的功能

def currentitem(self):
currentitem函数有一个功能,当用户单击并选择Qtreewidget中的一个项目时,它会获取currenitem文本并从中删除D字母并将其转换为int,然后将其显示为D=直径, A=面积等

def hidethiswindow(self)
hidethiswindow函数此函数引导用户选择项目或取消小部件,如果用户错误地选择了headeritem,将出现一条错误消息,告诉用户选择子项目。充满力量,不是吗


其余代码用于显示和Qsettings。希望这能解释代码

您需要做的是保存每个项的数据。为此,我创建了itemToTuple方法,该方法返回要保存的数据的元组,并且在保存元组的情况下,您必须设置这些属性,并为此使用tupleToItem函数(如果您想添加更多项信息,只需修改这些方法)。但要保存QTreeWidget的所有项,必须遍历整个树。为此,将使用返回项及其子项数据的dataFromChild方法。相反的过程是,如果必须在所有项中建立数据,则必须使用dataToChild,这将为项及其子项建立相应的数据

我还将应用程序划分为几个类进行排序,如果希望保存小部件的信息,则必须创建一个名为writeSettings(…)的方法,其格式与我显示的格式类似,然后应用程序将调用closeEvent(…)方法。类似地,您可以创建readSettings(…)方法并在其构造函数中调用它

import os
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

iconroot = os.path.dirname(__file__)
ORGANIZATION_NAME = 'Circularcolumn App'
ORGANIZATION_DOMAIN = 'Circular shape'
APPLICATION_NAME = 'QSettings program'
SETTINGS_TRAY = 'settings/tray'

QSS = """
QTreeWidget{
    border:none;
 } 

QTreeView::branch:has-siblings:!adjoins-item {
   border-image: url(images/vline.png) 0;
}

QTreeView::branch:has-siblings:adjoins-item {
    border-image: url(images/branch-more.png) 0;
}

QTreeView::branch:!has-children:!has-siblings:adjoins-item {
    border-image: url(images/branch-end.png) 0;
}

QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
    border-image: none;
    image: url(images/branch-closed.png);
}

QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {
    border-image: none;
    image: url(images/branch-open.png);
}
"""


class TreeWidget(QtWidgets.QTreeWidget):
    currentTextChanged = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super(TreeWidget, self).__init__(parent)
        self.currentItemChanged.connect(self.onCurrentItemChanged)
        self.setHeaderLabel('Standard Section Library')
        self.setRootIsDecorated(True)
        self.setAlternatingRowColors(True)
        self.readSettings()
        self.expandAll()

    def onCurrentItemChanged(self, current, previous):
        if current not in [self.topLevelItem(ix) for ix in range(self.topLevelItemCount())]:
            self.currentTextChanged.emit(current.text(0))

    def readSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("TreeWidget")
        values = settings.value("items")
        if values is None:
            self.loadDefault()
        else:
            TreeWidget.dataToChild(values, self.invisibleRootItem())
            self.customized_item = None
            for ix in range(self.topLevelItemCount()):
                tlevel_item = self.topLevelItem(ix)
                if tlevel_item.text(0) == "Customized":
                    self.customized_item = tlevel_item
        settings.endGroup()

    def writeSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("TreeWidget")
        settings.setValue("items", TreeWidget.dataFromChild(self.invisibleRootItem()))
        settings.endGroup()

    def loadDefault(self):
        standardsectionlist = ["D100","D150","D200","D250","D300","D350","D400","D450","D500",
        "D550","D600","D650","D700","D750","D800","D850","D900","D950","D1000"]
        rootItem = QtWidgets.QTreeWidgetItem(self, ['Circular shapes'])
        rootItem.setIcon(0, QtGui.QIcon(os.path.join(iconroot,"images/circularcolumnnorebar.png")))
        for element in standardsectionlist:
            rootItem.addChild(QtWidgets.QTreeWidgetItem([element]))

        self.customized_item = QtWidgets.QTreeWidgetItem(self, ["Customized"])
        self.customized_item.setIcon(0, QtGui.QIcon(os.path.join(iconroot,"images/circularcolumnnorebar.png")))

    @staticmethod
    def dataToChild(info, item):
        TreeWidget.tupleToItem(info["data"], item)
        for val in info["childrens"]:
            child = QtWidgets.QTreeWidgetItem()
            item.addChild(child)
            TreeWidget.dataToChild(val, child)

    @staticmethod
    def tupleToItem(t, item):
        # set values to item
        ba, isSelected = t
        ds = QtCore.QDataStream(ba)
        ds >> item
        item.setSelected(isSelected) 

    @staticmethod
    def dataFromChild(item):
        l = []
        for i in range(item.childCount()):
            child = item.child(i)
            l.append(TreeWidget.dataFromChild(child))
        return {"childrens": l, "data": TreeWidget.itemToTuple(item)}

    @staticmethod
    def itemToTuple(item):
        # return values from item
        ba = QtCore.QByteArray()
        ds = QtCore.QDataStream(ba, QtCore.QIODevice.WriteOnly)
        ds << item
        return ba, item.isSelected()


class InfoWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(InfoWidget, self).__init__(parent)
        hlay = QtWidgets.QHBoxLayout(self)
        plabel = QtWidgets.QLabel()
        pixmap = QtGui.QPixmap(os.path.join(iconroot, "images/circularcolumnnorebard.png"))\
                    .scaled(230, 230, QtCore.Qt.KeepAspectRatio)
        plabel.setPixmap(pixmap)
        hlay.addWidget(plabel)
        self.ilabel = QtWidgets.QLabel()
        hlay.addWidget(self.ilabel)
        hlay.addStretch()
        self.readSettings()

    @QtCore.pyqtSlot(str)
    def setData(self, text):
        try:
            circular_section = int(text.translate({ord('D'): ""}))
            area = (3.1416/4)*(circular_section**2)
            inertia = (3.1416/64)*circular_section**4
            fmt = "D = {}mm\nA = {:0.2E}mm2\n I  = {:0.2E}mm4"
            self.ilabel.setText(fmt.format(circular_section, area, inertia))
        except ValueError:
            pass

    def readSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("InfoWidget")
        self.ilabel.setText(settings.value("text", ""))
        settings.endGroup()

    def writeSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("InfoWidget")
        settings.setValue("text", self.ilabel.text())
        settings.endGroup()


class CircularDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(CircularDialog, self).__init__(parent)
        grid = QtWidgets.QGridLayout(self)

        self.tree = TreeWidget()
        self.infoWidget = InfoWidget()

        section_lay = QtWidgets.QHBoxLayout()
        section_label = QtWidgets.QLabel("Section name: ")
        section_edit = QtWidgets.QLineEdit('Define en name to section')
        section_lay.addWidget(section_label)
        section_lay.addWidget(section_edit)

        self.tree.currentTextChanged.connect(self.infoWidget.setData)

        button_layout = QtWidgets.QVBoxLayout()
        add_button = QtWidgets.QPushButton("Add")
        add_button.clicked.connect(self.addItem)
        delete_button = QtWidgets.QPushButton("Delete")
        delete_button.clicked.connect(self.removeItem)
        button_layout.addWidget(add_button, alignment=QtCore.Qt.AlignBottom)
        button_layout.addWidget(delete_button, alignment=QtCore.Qt.AlignTop)

        buttonBox = QtWidgets.QDialogButtonBox()
        buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        buttonBox.accepted.connect(self.accept) 
        buttonBox.rejected.connect(self.reject)

        # for windows, posible bug
        self.accepted.connect(self.write_all_data)
        self.rejected.connect(self.write_all_data)

        grid.addLayout(section_lay, 0, 0)
        grid.addWidget(self.tree, 1, 0)
        grid.addLayout(button_layout, 1, 1)
        grid.addWidget(self.infoWidget, 2, 0, 1, 2)
        grid.addWidget(buttonBox, 3, 0, 1, 2)
        self.readSettings()

    def readSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("CircularDialog")
        self.setGeometry(settings.value("geometry", QtCore.QRect(300, 300, 400, 600)))
        settings.endGroup()

    def writeSettings(self):
        settings = QtCore.QSettings()
        settings.beginGroup("CircularDialog")
        settings.setValue("geometry", self.geometry())
        settings.endGroup()

    def closeEvent(self, event):
        self.write_all_data()
        super(CircularDialog, self).closeEvent(event)

    def write_all_data(self):
        for children in self.findChildren(QtWidgets.QWidget) + [self]:
            if hasattr(children, "writeSettings"):
                children.writeSettings()

    def addItem(self):
        text, ok = QtWidgets.QInputDialog.getText(self, "Add custom section", 
            "Enter section geometry f.ex as D325 or just 325 in mm: ")
        if ok:
            it = QtWidgets.QTreeWidgetItem([text])
            self.tree.customized_item.addChild(it)

    def removeItem(self):
        it = self.tree.customized_item.takeChild(0)
        del it


if __name__ == '__main__':
    QtCore.QCoreApplication.setApplicationName(ORGANIZATION_NAME)
    QtCore.QCoreApplication.setOrganizationDomain(ORGANIZATION_DOMAIN)
    QtCore.QCoreApplication.setApplicationName(APPLICATION_NAME)

    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet(QSS)
    w = CircularDialog()
    w.show()
    sys.exit(app.exec_())
导入操作系统
导入系统
从PyQt5导入QtCore、QtGui、QtWidgets
iconroot=os.path.dirname(_文件__)
组织机构名称='Circularcolumn应用程序'
组织结构域='圆形'
应用程序名称='QSettings程序'
设置\托盘='设置/托盘'
QSS=“”
QTreeWidget{
边界:无;
} 
QTreeView::分支:具有同级:!邻接项{
边框图片:url(images/vline.png)0;
}
QTreeView::分支:具有同级:邻接项{
边框图片:url(images/branch more.png)0;
}
QTreeView::分支:!有子项:!有同级项:邻接项{
边框图片:url(images/branch end.png)0;
}
QTreeView::分支:有子级:!有同级:已关闭,
QTreeView::分支:已关闭:有子级:有同级{
边界图像:无;
image:url(images/branch closed.png);
}
QTreeView::分支:打开:有子级:!有同级,
QTreeView::分支:打开:有子级:有同级{
边界图像:无;
image:url(images/branch open.png);
}
"""
类TreeWidget(QtWidgets.QTreeWidget):
currentTextChanged=QtCore.pyqtSignal(str)
def uuu init uuu(self,parent=None):
超级(树边,自).\u初始(父)
self.currentItemChanged.connect(self.onCurrentItemChanged)
self.setHeaderLabel(“标准节库”)
self.setRootIsDecorated(真)
self.setAlternatingRowColor(真)
self.readSettings()
self.expandAll()
def onCurrentItemChanged(自身、当前、以前):
如果当前不在范围(self.topLevelItemCount())内ix的[self.topLevelItem(ix)]中:
self.currentTextChanged.emit(current.text(0))
def读取设置(自身):
设置=QtCore.QSettings()
settings.beginGroup(“TreeWidget”)
值=设置值(“项目”)
如果值为“无”:
self.loadDefault()
其他:
TreeWidget.dataToChild(值,self.invisibleRootItem())
self.customized_项目=无
对于范围内的ix(self.topLevelItemCount()):
t水平项目=自身。顶级项目(九)
如果tlevel_item.text(0)=“自定义”:
self.customized_item=t级别_item
settings.endGroup()
def写入设置(自):
设置=QtCore.QSettings()
settings.beginGroup(“TreeWidget”)
settings.setValue(“items”,TreeWidget.dataFromChild(self.invisibleRootItem()))
settings.endGroup()
def加载默认值(自):
standardsectionlist=[“D100”、“D150”、“D200”、“D250”、“D300”、“D350”、“D400”、“D450”、“D500”,
“D550”、“D600”、“D650”、“D700”、“D750”、“D800”