Python Inspect模块找不到pyqt类

时间:2017-07-11 22:42:22

标签: python python-2.7 class pyqt pyqt5

我在这个网站上找到了一个非常好的解决方案,以便在pyqt5中存储gui设置:Python PyQt4 functions to save and restore UI widget values?

解决方案保存在 guisave 功能中。

现在我试图将此功能实现到我的代码中。 我的想法是用 exitAction 按钮关闭我的gui。这会触发 closeApp 函数,该函数会触发 guisave 函数。 guisave 函数现在应该保存我所有的pyqt对象 问题是这不会发生。我不确定如何在 guisave 函数中指定 ui 变量。 如您所见,我尝试分配主窗口类。但这不起作用。我还不确定这是否有效,或者我是否需要单独扫描所有功能,因为 QEditLine 在tab2UI函数中。

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

class mainwindow(QMainWindow):
    def __init__(self, parent = None):
        super(mainwindow, self).__init__(parent)

        self.initUI()


    def initUI(self):
        exitAction = QAction(QIcon('icon\\exit.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(qApp.quit)     
        exitAction.triggered.connect(self.closeApp)     

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.setMovable(False)
        self.toolbar.addAction(exitAction)

        self.tab_widget = QTabWidget(self)     # add tab

        self.tab2 = QWidget()
        self.tab_widget.addTab(self.tab2, "Tab_2") 
        self.tab2UI()

        self.setCentralWidget(self.tab_widget)


    def tab2UI(self):
        self.layout = QFormLayout()
        self.layout.addRow("Name",QLineEdit())
        self.layout.addRow("Address",QLineEdit())
        self.tab2.setLayout(self.layout)


    def closeApp(self):
        guisave()


def guisave():
    ui = mainwindow
    settings = QSettings('gui.ini', QSettings.IniFormat)

    for name, obj in inspect.getmembers(ui): 
        if isinstance(obj, QComboBox):
            name = obj.objectName()  # get combobox name
            index = obj.currentIndex()  # get current index from combobox
            text = obj.itemText(index)  # get the text for current index
            settings.setValue(name, text)  # save combobox selection to registry

        if isinstance(obj, QLineEdit):
            print obj.objectName()
            name = obj.objectName()
            value = obj.text()
            settings.setValue(name, value)  # save ui values, so they can be restored next time
            print name, value

        if isinstance(obj, QCheckBox):
            name = obj.objectName()
            state = obj.isChecked()
            settings.setValue(name, state)

        if isinstance(obj, QRadioButton):
            name = obj.objectName()
            value = obj.isChecked()  # get stored value from registry
            settings.setValue(name, value)


def main():
    app = QApplication(sys.argv)
    ex = mainwindow()
    ex.setGeometry(100,100,1000,600)
    ex.show()
    sys.exit(app.exec_())



if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:0)

我建议的解决方案负责保存QWidgets的状态,但为此必须在属性objectName中输入一个名称:

  

objectName:QString

     

此属性包含此对象的名称。您可以使用findChild()按名称(和类型)查找对象。您可以   使用findChildren()找到一组对象。

     

访问功能:

     

QString objectName() const

     

void setObjectName (const QString& name)

所以你应该输入一个名字,例如:

self.tab_widget.setObjectName("tabWidget")

我们可以使用QApplication :: allWidgets()函数来获取应用程序的所有小部件,然后我们获取属性并保存它们,恢复过程与前一个相反。

def restore(settings):
    finfo = QFileInfo(settings.fileName())

    if finfo.exists() and finfo.isFile():
        for w in qApp.allWidgets():
            mo = w.metaObject()
            if w.objectName() != "":
                for i in range(mo.propertyCount()):
                    name = mo.property(i).name()
                    val = settings.value("{}/{}".format(w.objectName(), name), w.property(name))
                    w.setProperty(name, val)


def save(settings):
    for w in qApp.allWidgets():
        mo = w.metaObject()
        if w.objectName() != "":
            for i in range(mo.propertyCount()):
                name = mo.property(i).name()
                settings.setValue("{}/{}".format(w.objectName(), name), w.property(name))

找到完整示例here