PyQt4:如何正确加载编译的ui文件?

时间:2015-07-08 14:03:48

标签: qt python-2.7 pyqt4 loadui

我创建了一个包含所有ui文件的Qt资源文件,我在python文件中使用pyrcc4命令行编译,然后使用loadUi加载了ui文件。这是一个例子:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os
import sys

from PyQt4.QtCore import Qt, QFile
from PyQt4.uic import loadUi
from PyQt4.QtGui import QDialog

from xarphus.gui import ui_rc
# I import the compiled qt resource file named ui_rc

BASE_PATH = os.path.dirname(os.path.abspath(__file__))
#UI_PATH = os.path.join(BASE_PATH, 'gui', 'create_user.ui')
UI_PATH = QFile(":/ui_file/create_user.ui")
# I want to load those compiled ui files, 
# so I just create QFile.

class CreateUser_Window(QDialog):
    def __init__(self, parent):

        QDialog.__init__(self, parent)

        # I open the created QFile
        UI_PATH.open(QFile.ReadOnly)
        # I read the QFile and load the ui file
        self.ui_create_user = loadUi(UI_PATH, self)
        # After then I close it
        UI_PATH.close()

它的工作正常,但我有一个问题。当我打开GUI窗口一次,一切正常。关闭窗口后,我尝试再次打开相同的GUI窗口,我得到ja long traceback。

  
    

回溯(最近一次调用最后一次):文件“D:\ Dan \ Python \ xarphus \ xarphus \ frm_mdi.py”,第359行,     create_update_form self.update_form = Update_Window(self)文件     “D:\ Dan \ Python \ xarphus \ xarphus \ frm_update.py”,第135行, init     self.ui_update = loadUi(UI_PATH,self)文件     “C:\ Python27 \ lib \ site-packages \ PyQt4 \ uic__init __。py”,第238行,in     loadUi返回DynamicUILoader(包).loadUi(uifile,baseinstance,     resource_suffix)文件     “C:\ Python27 \ lib \ site-packages \ PyQt4 \ uic \ Loader \ _ loader.py”,第71行,     在loadUi中返回self.parse(filename,resource_suffix,basedir)文件     “C:\ Python27 \ lib \ site-packages \ PyQt4 \ uic \ uiparser.py”,第984行,     parse document = parse(filename)文件     “C:\ Python27 \ lib \ xml \ etree \ ElementTree.py”,第1182行,在解析中     tree.parse(source,parser)文件     “C:\ Python27 \ lib \ xml \ etree \ ElementTree.py”,第657行,在解析中     self._root = parser.close()文件     “C:\ Python27 \ lib \ xml \ etree \ ElementTree.py”,第1654行,关闭     self._raiseerror(v)文件“C:\ Python27 \ lib \ xml \ etree \ ElementTree.py”,     第1506行,在_raiseerror中引发错误xml.etree.ElementTree.ParseError:     找不到元素:第1行,第0列

  

每个人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

也许我有一个解决方案,但我不知道这是否是一个完美的pythonic。

好吧,我们知道所有python项目都有一个__ init __-文件。我们需要它来初始化Python包,对吗?好吧,我想:为什么不使用这个文件?我做了什么?我在__ init __ -file中定义了一个如下函数:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4.uic import loadUi
from PyQt4.QtCore import Qt, QFile

def ui_load_about(self):
    uiFile = QFile(":/ui_file/about.ui")
    uiFile.open(QFile.ReadOnly)
    self.ui_about = loadUi(uiFile)
    uiFile.close()

    return self.ui_about

现在我的" About_Window" -class我这样做:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os
import sys

from PyQt4.QtCore import Qt, QFile
from PyQt4.uic import loadUi
from PyQt4.QtGui import QDialog

import __init__ as ui_file

class About_Window(QDialog):
    def __init__(self, parent):

        QDialog.__init__(self, parent)

        self.ui_about = ui_file.ui_load_about(self)

您看到我将包文件(__ init __-文件)导入为ui_file,然后我调用该函数并将函数的返回保存在变量self.ui_about中。

在我的情况下,我从MainWindow(QMainWindow)打开About_Window,它看起来像这样:

def create_about_form(self):
    self.ui_about = About_Window(self)

    # Now when I try to show (show()-method) a window I get two windows
    # The reason is: I open and load the ui files from compiled
    # qt resorce file that was define in __init__-module. 
    # There is a function that opens the resource file, reads  
    # the ui file an closes and returns the ui file back

    # That's the reason why I have commented out this method
    #self.ui_about.show()

你看我注释掉了show() - 方法。它没有这种方法。我只定义了About_Window() - 类。我知道这不是最好的解决方案,但它确实有效。我可以一次又一次地打开窗户而没有追溯。

如果您有更好的解决方案或想法,请告诉我: - )