使用QTDesigner与PyQT和Python 2.6

时间:2010-03-22 02:08:10

标签: python qt4 pyqt4 qt-designer

我是Python的新手,并开始使用PyQT4.7和Python 2.6自学GUI编程(希望如此)

我刚刚从PyQT网站上下载了整个PyQT / QT4软件包(包括QTDesigner),但它似乎是QTDesigner,它看起来很棒,可以用作新手(因为你可以看到所有属性/属性/默认值等)小部件和可视化编辑属性是很好的,但PyQT似乎没有设置QTDesigner直接与PyQT和PyQTs python代码生成脚本集成:

:点击“查看代码”,尝试运行名为(uic)的Designer-> C ++脚本,而不是pyuic.py脚本等。

有没有办法让QTDesigner与PyQT紧密集成以便像在C ++中一样动态生成代码?

如果没有,这是否意味着我必须在我的Python IDE中编写整个QT GUI并查找每个小部件的所有文档和样板代码? (与仅使用QTDesigner + Python集成相比,效率非常低,效率低)。

使用Designer和PyQT的习惯工具链//生产流程是什么? (如果不能直接集成 - python + pyQT用户是否只是一起跳过使用QTDesigner并手动在python中编写所有QT GUI代码?)

对于PyQT新手的任何其他提示/建议将不胜感激。谢谢!

ps我知道你们可能会告诉我只是把它搞砸并手工编写所有QT用户界面,但如果我按照上面的要求学习使用Designer,请提供一种方法来做到这一点可以更轻松地学习它,谢谢!

4 个答案:

答案 0 :(得分:20)

我开始写我的第一个PyQt的应用程序(PyQt的仅用于处理GUI),似乎,那好工具链:QtDesigner产生的.ui S和处理资源和一些IDE,可以设置QtDesigner编辑这些。我使用Eclipse,因为它是高度可定制的。 您可以按需要编译.qrc和.ui,方法是在应用程序启动时,或在安装时或任何其他时间执行此操作:

os.system("pyrcc4.exe -o ui/images_rc.py ui/images/images.qrc")
uic.compileUiDir(appDir + '/ui', True)

然后以这种方式使用生成的类:

class MyMainWindow(QtGui.QMainWindow):

    def __init__(self, owner):
        QtGui.QMainWindow.__init__(self)
        # 'Ui_MyMainWindow' is the class, that was generated by uic, 
        # naming convention is: 'Ui_' plus the name of root widget in designer
        self.ui = Ui_MyMainWindow()
        self.ui.setupUi(self)

或者你可以在容器inits:

时直接加载.ui
    QtGui.QMainWindow.__init__(self)
    self.ui = None
    uic.loadUi('MyMainWindowUI.ui', self.ui)
    #now you have the instance of Ui_MyMainWindow in self.ui too, as above

请注意,我有UI添加后缀以.UI文件的名称,它是为了避免名称交汇,造成.py文件,由UIC生成的名字,是不是类名称以“Ui_”,但只是根小部件的之一。

和另一个注:在生成的文件UIC的地方“进口%.qrc名称%_RC”结束(默认情况下是进口images_rc)字符串,所以你必须意识到这一点使用时pyrcc4

整个方法足够灵活,它需要你的所有虚拟ui编码工作;但你仍然可以在MyMainWindow.ui属性中进行一些微调,其中Ui_MyMainWindow的实例位于其中;它避免了不必要的继承。就个人而言,我在MyMainWindow中做了_connectSlots和_initIntefrace方法来做一些工作设计师不能。

我还是要注意,自己编写接口代码是很好的方法,因为uic生成的代码是UGLY。我比较喜欢,因为这loadUi()代替加载的.ui :)如果你有大量的自定义PyQt的控制,它是如此booooring以使它们QtDesigner ..

答案 1 :(得分:2)

我做的是我创建了自己的uic可执行文件,它是pyuic.py脚本的包装器。

你需要......

  1. 获取并安装py2exe

  2. 在下面的uic.py代码中替换PYTHON_PATH

  3. 编辑site-packages \ PyQt4中的qt.conf文件,并设置Binaries = Path到包含uic exe的文件夹。

  4. 将uic.py和setup.py放在同一个文件夹中

  5. 在命令提示符中,导航到setup.py和uic.py所在的文件夹,然后运行以下命令“python setup.py py2exe”。

  6. // ---- uic.py

    #uic.py
    import subprocess
    import sys
    
    args = ""
    
    for arg in sys.argv: 
        if sys.argv[0] != arg:
            args += arg + " "
    
    
    # Start pyuic.py script
    command = 'python %PYTHON_PATH%\\PyQt4\\uic\\pyuic.py '+ args
    out = ''
    
    
    child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE)
    complete = False
    while True:
        out = child.stderr.read(1)
        if out == '' and child.poll() != None:
            break
        if out != '':
            sys.stdout.write(out)
            sys.stdout.flush()
    

    // ----- setup.py

    #setup.py    
    from distutils.core import setup
    import py2exe
    
    setup(windows=[{"script":"uic.py"}], options={"py2exe" : {"includes" : ["sip", "PyQt4.QtCore"]}})
    

答案 2 :(得分:1)

您可以在控制台中手动运行pyuic(或更确切地说pyuic4)。您可以使用Python设计器创建GUI,就像使用C ++一样。

顺便说一句:我已经为我的应用程序(10k代码)编写了所有GUI内容。当你需要调整一些东西时,我真的不喜欢GUI设计师并使用生成的代码。

答案 3 :(得分:0)

QtDesigner使用uic.exe生成动态C ++代码。 uic.exe是一个命令行工具,它将文件名作为输入参数。为了与python集成,你可以编写一个使用pyuic.py的python程序,将输入与uic.exe的输入(顺序,开关等)匹配,将其转换为可执行文件(使用py2exe)并重命名uic.exe的可执行文件。然后用Qt的bin目录中的uic.exe替换它(据我所知,uic.exe在PyQt中不存在)。您应该注意uic.exe的输入参数和您手写的宏(它们应该匹配在一起)。

我认为你的程序需要知道python的路径(为了使用pyuic)。如果您使用的是Windows,则可以从注册表中获取路径。