20

我是 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 UI,但是如果我在按照上面的要求学习时使用 Designer,请提供一种方法,以便我可以学习它更容易,谢谢!

4

4 回答 4

20

我开始编写我的第一个 PyQT 应用程序(PyQT 仅用于处理 GUI),看起来,好的工具链是:QtDesigner 生成 .ui 和处理资源和一些 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)

或者您可以在容器初始化时直接加载 .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 后缀,这样做是为了避免名称交叉,导致由 uic 生成的 .py 文件的名称不是以“Ui_”开头的类名,而只是根小部件的名称。

另一个注意事项:在生成的文件 uic 的末尾放置 'import %.qrc name%_rc'(默认为 import images_rc)字符串,因此在使用 pyrcc4 时必须注意这一点。

整个方法足够灵活,它需要您完成所有虚拟 ui 编码工作;但是您仍然可以在 MyMainWindow.ui 属性中进行一些微调,该属性是 Ui_MyMainWindow 的实例所在的位置;它避免了不必要的继承。就个人而言,我在 MyMainWindow 中使用 _connectSlots 和 _initInterace 方法来完成设计师无法完成的一些工作。

不过我必须注意,自己编写接口代码是个好方法,因为由 uic 生成的代码很丑陋。因为这个原因,我更喜欢通过 loadUi() 加载 .ui :) 如果你有很多自定义 PyQT 控件,那么将它们带入 QtDesigner 真是太棒了。

于 2010-03-24T10:27:06.880 回答
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”。

//----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"]}})
于 2012-11-19T20:16:49.933 回答
1

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

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

于 2010-03-22T18:11:49.100 回答
0

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

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

于 2010-08-29T18:15:06.720 回答