将qtDesigner的.ui文件链接到python/pyqt?

83

如果我进入QtDesigner并构建UI,那么它将保存为.ui文件。我如何将其制作为Python文件或在Python中使用它?


1
我使用了PySide QUiLoader来实现这一点 - 请参见帖子4442286 - Sven
以下方法更加实用:https://dev59.com/nmUp5IYBdhLWcg3w_rcl#14894550 - iled
12个回答

66

在您的代码中使用 .ui 的另一种方法是:

from PyQt4 import QtCore, QtGui, uic
class MyWidget(QtGui.QWidget)
    ...
    #somewhere in constructor:
    uic.loadUi('MyWidget.ui', self)

两种方法都可以。不要忘记,如果你使用Qt资源文件(非常有用)来存储图标等内容,那么你必须将其编译:

pyrcc4.exe -o ui/images_rc.py ui/images/images.qrc

注意:当uic编译界面时,它会在.py文件末尾添加'import images_rc',因此您必须将资源编译到该名称的文件中,或者在生成的代码中重命名它。


2
你能否添加如何访问变量的内容?例如pushButton? - Jonathan
4
如果在 .ui 文件中定义了一个按钮,你可以这样调用它:self.pushButton。你还可以将 UI 加载到任何类属性中:uic.loadUi('uifile.ui', self.ui),然后像这样调用小部件:self.ui.pushButton。 - Maxim Popravko

55

结合Max的回答Shriramana Sharma的邮件列表帖子,我构建了一个小的工作示例来加载包含QMainWindowmywindow.ui文件(所以只需选择在Qt Designer的File-New对话框中创建一个主窗口)。

这是加载它的代码:

import sys
from PyQt4 import QtGui, uic

class MyWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        uic.loadUi('mywindow.ui', self)
        self.show()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MyWindow()
    sys.exit(app.exec_())

3
这应该是最好的答案,因为它是一个完整的例子。 - Francesco Pasa

30
你需要使用pyuic工具(site-packages\pyqt4\bin)从你的ui文件生成一个python文件。
pyuic form1.ui > form1.py

使用PyQt4

pyuic4.bat form1.ui > form1.py

你可以将form1导入脚本中。


25

我发现这篇文章非常有帮助。

http://talk.maemo.org/archive/index.php/t-43663.html

我将简要描述从该文章中获得的创建和更改.ui文件为.py文件的操作。

  1. 从开始菜单启动Qt Designer。
  2. 从“新建表单”窗口,创建“主窗口”。
  3. 从左侧的“窗口小部件菜单”的底部的“显示窗口小部件”
    添加一个“标签窗口小部件”。(点击拖放)
  4. 双击新添加的标签控件以更改其名称为“Hello World”。
  5. 此时,您可以使用Control + R热键查看它的外观。
  6. 如果需要,通过拖放添加按钮、文本或其他小部件。
  7. 现在保存你的表单.. 文件->另存为-> “Hello World.ui” (Control+S也会呈现
    “另存为”选项)记下你保存“Hello World”的目录。.ui
    文件。(我为了方便而将其保存在(C:)中)

文件已经创建并保存,现在我们将使用pyuic生成Python代码!

  1. 从开始菜单打开一个命令窗口。
  2. 现在“cd”到你保存“Hello World.ui”的目录中。对我来说,我只需要
    “cd\”就到了我的“C:”提示符,其中保存了我的“Hello World.ui”。
  3. 当您到达文件所在的目录时,请键入以下内容。
  4. pyuic4 -x helloworld.ui -o helloworld.py
  5. 恭喜!!您现在拥有一个Python Qt4 GUI应用程序!
  6. 双击您的helloworld.py文件以运行它。(我使用pyscripter,双击后
    它会在pyscripter中打开,然后我从那里“运行”该文件)

希望这能帮助到某些人。


1
我正在使用以下命令进行编译:pyuic4 helloworld.ui > helloworld.py。实际上,我们必须向pyuic4传递-x和-o参数。感谢提供这些信息! - muammar
非常好的解释,特别是“GUI生成”代码实际上在生成的文件中的部分帮了我很多,谢谢! - Valmond

17

您也可以使用以下代码在PyQt5中使用uic

from PyQt5 import uic, QtWidgets
import sys

class Ui(QtWidgets.QDialog):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi('SomeUi.ui', self)
        self.show()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Ui()
    sys.exit(app.exec_())

13

以我的观点来看,更加清晰的方法是先按照上述方法导出为 .py 文件:

pyuic4 foo.ui > foo.py

然后在你的代码中(例如 main.py)使用它,例如:

from foo import Ui_MyWindow


class MyWindow(QtGui.QDialog):
    def __init__(self):
        super(MyWindow, self).__init__()

        self.ui = Ui_MyWindow()
        self.ui.setupUi(self)

        # go on setting up your handlers like:
        # self.ui.okButton.clicked.connect(function_name)
        # etc...

def main():
    app = QtGui.QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

这种方式可以让不使用qt-designer的其他人阅读代码,并且将功能代码放在foo.py之外,以防其被设计师覆盖。您只需通过上面所示的MyWindow类引用ui即可。


self.ui.okButton.clicked.connect(self.function_name) 给我返回了 TypeError: event() takes 1 positional argument but 2 were given。你是如何解决的? - Ahsanul Haque

9
您可以使用以下命令将您的.ui文件转换为可执行的Python文件。
pyuic4 -x form1.ui > form1.py

现在,您可以直接执行Python文件,方法如下:

python3(whatever version) form1.py

你可以导入这个文件并使用它。

如果您省略了-x选项,您将无法获得创建和运行应用程序的代码部分。我看到过一些省略“-x”的答案。这个答案是最完整的。 - Not a machine

5

你可以像这样编译UI文件

pyuic4 -x helloworld.ui -o helloworld.py

4
为了将.ui文件编译为.py文件,我执行了以下操作:
python pyuic.py form1.ui > form1.py

注意。


3
将UI文件转换为.py文件的PyQt5命令为:

pyuic5.exe youruifile.ui -o outputpyfile.py -x


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接