使用eric创建一个PyQt项目

更多

在上一篇文章中,我们已经把eric安装配置完毕,本文将继续这一话题,介绍如何使用eric创建一个PyQt项目。在这个项目中,我们实现了两个能够修改标签文字的按钮和一个可以关闭对话框的按钮。

1.新建项目

打开eric,点击【项目】-【新建】,会弹出如下的对话框。这里我们创建一个名为pyqtdemo的项目。注意,在创建项目时,eric不会自动根据填写的项目名称修改项目文件夹名称!

eric新建项目

点击确定之后,可以看到一个源代码树中只有__init__.py的项目。当然,此时eric还创建了几个文件,并不会在这里显示出来,他们分别是项目文件”pyqtdemo.e4p”和”_eric4project”文件夹。

2.新建窗体

将左侧的【源代码】选项卡切换至【窗体】选项卡(左数第二个)。

选择窗体

右键空白区域,选择【新建窗体】。

新建窗体

在弹出的对话框中选择【对话框】。

新建对话框

在弹出的文件对话框中,选择文件位置,并填写文件名称。这里,我们将其命名为pyqtdemo.ui。

选择窗体位置

确定后,就可以看到【窗体】选项卡中,有一个pyqtdemo.ui文件了。

3.设计窗体

右键点击“pyqtdemo.ui”文件,选择【在Qt设计师中打开】,我们将一睹Qt Designer的芳容。

Qt Designer界面

从图中可以看到,Qt Designer分为如下几个部分:

  • 菜单栏:包括文件、编辑、窗体、视图、设置、窗口和帮助。
  • 工具栏:包括文件操作、部件前后置、编辑窗口部件、编辑信号/槽、编辑伙伴、编辑Tab顺序、布局方式、调整大小等。
  • 部件栏:包括各种可用部件。
  • 窗体设计区域
  • 对象查看器:可以查看各部件对象关系树及其所属的类
  • 属性编辑器
  • 信号/槽编辑器
  • 动作编辑器
  • 资源编辑器

3.1 修改窗体属性

默认的窗体属性中,objectName(部件名称,其他程序引用时使用)默认为Dialog,windowTitle(窗体标题)默认也是Dialog。我们可以根据自己的需要,对对话框的各个属性进行修改。这里,我只修改了windowTitle为“PyQt Demo”,并改变了其大小。

3.2 添加部件

从左侧的widget box中拖出3个PushButton,1个label。修改它们的objectName、text等属性。其中3个PushButton的ObjectName分别为btn1、btn2、btnClose。

添加后的效果图,如下图所示:

已编辑的界面

4.信号与槽

4.1 概念

在PyQt4中,事件处理的相关术语为“信号(signal)”和“槽(slot)”。

信号的含义就是我们常说的事件,比如按钮被按下、复选框勾选状态变更、可输入文本框文本变更等等。

的含义则是事件处理函数,比如关闭窗体、隐藏窗体、最大/小化、设置焦点、重绘等。

4.2 使用一个自带的槽

我们从工具栏中,选择【编辑信号/槽】。

信号和槽

拖动要编辑的部件,会出现一个类似于电路中接地符号的标志,并弹出对话框:

使用自带信号

这里,我们选择clicked(),即按钮被按下,此时看到右侧可选的槽并不多,并且没有我们希望使用到的关闭功能。

勾选【显示从QWidget继承的信号和槽】,这时可以发现,右侧的槽多了很多。在其中找到close(),点击确定。此时,点击【关闭】按钮执行对话框关闭的功能就已经实现了。

下图是已经创建了【关闭】按钮槽之后的窗体设计图。

新建槽/信号后的界面

4.3 第一次运行

虽然只实现了一个关闭功能,但是还是让我们先来看看如何运行这个到目前为止一行代码都没有写过的程序吧。

现在回到eric的界面,右键“pyqtdemo.ui”,选择【编译窗体】。

编译窗体

短暂的时间过后,可以看到如上图的编译成功提示。这时,我们切换到【源代码】选项卡,可以看到一个名为Ui_pyqtdemo.py的文件,这就是根据刚才那个ui文件自动编译而成的,我们不需要对其进行任何修改,也不应当对其进行任何修改,因为,任何对这种文件,在下次编译后,之前的修改会全部不存在

看,下图,就是我们第一次运行时的场景。在eric里,我们可以F2直接运行,或F5进行调试。

第一次运行

当我按下【关闭】的时候,窗体就会被关闭。

4.4 创建一个自定义槽

使用自带槽的方式很简单,然而,它所能实现的功能也是有限的,在我们的开发中,绝大多数信号发生时,不会使用默认的槽。因此,这一小节将通过按钮1、2的实现来介绍如何创建一个自定义槽。

自定义槽,就要求自己写其中的槽函数,而之前的操作中,我们还没有动手写过一次代码,那么这个槽的代码写在哪里呢?

我们再切换回【窗体】选项卡,右键pyqtdemo.ui,选择【生成对话框代码】。

首先,点击【新建】,新建一个类,在这里可以修改类名、文件名和路径。

生成对话框代码

然后在下面的选框中,选择自己需要使用到的信号。比如,我的选择如下图所示,是两个按钮被按下时的信号:

窗体代码生成器

这时,就生成了一个默认的代码。

对这个代码进行修改,实现预期的内容。

这里的修改中,其一是对import语句进行了修改,因为在一般的编程中,可能会用到QtGui和QtCore的多个类,并且默认代码的写法也可能造成命名空间的污染;其二是对于按钮被按下的状态添加了修改label文字内容的槽函数;其三,添加了窗体运行代码(见之前的文章)。

下面是按钮1被按下时候的效果图:

按下按钮1

按钮2被按下的效果图:

按下按钮2

本文内容遵从CC3.0版权协议,转载请注明:转自Pythoner

本文链接地址:使用eric创建一个PyQt项目

    • 被学者
    • 2014/03/12 4:24下午

    4.3 第一次运行
    ……回到eric的界面,右键“pyqtdemo.ui”,选择【编译窗体】。
    提示:窗体文件编译失败……、

    不知道是什么原因。

    安装时点过eric文件夹里的install.py,又运行过eric上一级文件夹里的install.py,不知道是这是这个原因。
    把PyQT、eric、和python2.7都卸载了重装,也不行。

      • analgestic
      • 2016/08/24 3:09下午

      可能是项目的文件路径中有包含有中文字符,我遇到过类似情况,改成全英文路径即可

        • 德玛西亚
        • 2017/01/17 4:23下午

        估计是他建项目的时候 没注意默认的是QT5 应该改成QT4 所以导致找不到pyuic5(应该是pyuic4才对)

      • 阿槑
      • 2017/07/09 4:22下午

      你好,我也出现了同样的问题,想问一下最后是怎么解决的,谢谢啦 [em_mobai]

      • xiaoniu
      • 2017/12/01 3:08下午

      请问解决了吗?我也遇到这样的问题了

    • 被学者
    • 2014/03/12 4:26下午

    编译所有窗体,没有编译成功或失败的提示,但没有生成文件……

    • 枫叶飘
    • 2014/05/15 11:49上午

    这个中文显示乱码怎么解决啊!

  1. 谢谢楼主 [em_zan]

    • cc
    • 2015/04/30 10:23上午

    eric下正常运行,但直接双击.py一闪而过不显示ui,用cxfreeze打包后的程序也是这样

      • zsx
      • 2015/10/29 3:43下午

      你是咋写的。我用setup文件打包的,

    • 问问提啊
    • 2015/10/04 6:47下午

    楼主我刚学pyqt,要自建槽函数时想直接生成对话框代码,结果说编码不行,
    :
    ‘ascii’ codec can’t encode characters in position 3-4: ordinal not in range(128)
    怎么办

      • alioth310
      • 2015/10/04 9:16下午

      你看下代码开始加好编码了么,比如# -*- coding: utf-8 -*-这样

        • 问问提啊
        • 2015/10/04 11:26下午

        是ui的源文件么?有加!

          • alioth310
          • 2015/10/05 12:50上午

          那试试显示的对话框里的字,改下编码呢

            • 问问提啊
            • 2015/10/05 1:15上午

            怎么改我不懂。。我就是右键点那个窗口下的UI文件然后点生成对话框代码,结果就出来这个信息:
            Warning:
            An unhandled exception occurred. Please report the problem
            using the error reporting dialog or via email to .
            A log has been written to “C:\Users\Administrator\_eric6\eric6_error.log”.

            Error information:
            ——————————————————————————–
            2015-10-05, 01:12:36
            ——————————————————————————–
            :
            ‘ascii’ codec can’t encode characters in position 3-4: ordinal not in range(128)
            ——————————————————————————–
            File “C:\Python27\Lib\site-packages\eric6\Project\ProjectFormsBrowser.py”, line 849, in __generateDialogCode
            dlg = CreateDialogCodeDialog(fn, self.project, self)
            File “C:\Python27\Lib\site-packages\eric6\Project\CreateDialogCodeDialog.py”, line 129, in __init__
            self.__updateSlotsModel()
            File “C:\Python27\Lib\site-packages\eric6\Project\CreateDialogCodeDialog.py”, line 238, in __updateSlotsModel
            self.formFile, package=self.project.getProjectPath())
            File “C:\Python27\lib\site-packages\PyQt4\uic\__init__.py”, line 236, in loadUi
            return DynamicUILoader(package).loadUi(uifile, baseinstance, resource_suffix)
            File “C:\Python27\lib\site-packages\PyQt4\uic\Loader\loader.py”, line 68, in loadUi
            filename = str(filename)

            ——————————————————————————–
            Version Numbers:
            Python 2.7.10
            Qt 4.8.7
            PyQt 4.11.4
            sip 4.16.8
            QScintilla 2.9
            WebKit 534.34
            eric6 6.0.9 (rev. 1d7d42500f54)

            Platform: win32
            2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)]
            ——————————————————————————–
            Plugins Version Numbers:
            PluginAbout 6.0.0
            PluginCodeStyleChecker 6.0.0
            PluginEricapi 6.0.0
            PluginEricdoc 6.0.0
            PluginSyntaxChecker 6.0.0
            PluginTabnanny 6.0.0
            PluginVcsMercurial 6.0.0
            PluginVcsPySvn 6.0.0
            PluginVcsSubversion 6.0.0
            PluginVmListspace 6.0.0
            PluginVmTabview 6.0.0
            PluginWizardE5MessageBox 6.0.0
            PluginWizardPyRegExp 6.0.0
            PluginWizardQColorDialog 6.0.0
            PluginWizardQFileDialog 6.0.0
            PluginWizardQFontDialog 6.0.0
            PluginWizardQInputDialog 6.0.0
            PluginWizardQMessageBox 6.0.0
            PluginWizardQRegExp 6.0.0
            PluginWizardQRegularExpression 6.0.0

            说是系统默认为accii编码,我也用sys.setdefaultencode(‘utf8’)试过了,也不行。另外我也装了eric4试过,还是同样的问题,现在好苦逼啊

    • wbango
    • 2015/10/21 4:42下午

    右键pyqtdemo.ui,选择【生成对话框代码】时,出现以下的错误
    Warning:
    An unhandled exception occurred. Please report the problem
    using the error reporting dialog or via email to .
    A log has been written to “C:\Users\ASUS\_eric6\eric6_error.log”.

    Error information:
    ——————————————————————————–
    2015-10-21, 16:42:09
    ——————————————————————————–
    :
    arguments did not match any overloaded call:
    QByteArray(): too many arguments
    QByteArray(int, str): argument 1 has unexpected type ‘str’
    QByteArray(QByteArray): argument 1 has unexpected type ‘str’
    ——————————————————————————–
    File “D:\Program Files\Python\Python34\Lib\site-packages\eric6\Project\ProjectFormsBrowser.py”, line 840, in __generateDialogCode
    dlg = CreateDialogCodeDialog(fn, self.project, self)
    File “D:\Program Files\Python\Python34\Lib\site-packages\eric6\Project\CreateDialogCodeDialog.py”, line 128, in __init__
    self.__updateSlotsModel()
    File “D:\Program Files\Python\Python34\Lib\site-packages\eric6\Project\CreateDialogCodeDialog.py”, line 292, in __updateSlotsModel
    QByteArray(“p{0:d}”.format(index))

    ——————————————————————————–
    Version Numbers:
    Python 3.4.3
    Qt 5.5.0
    PyQt5 5.5
    sip 4.16.9
    QScintilla 2.9
    WebKit 538.1
    eric6 6.0.3 (rev. b876fbf55438)

    Platform: win32
    3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)]
    ——————————————————————————–
    Plugins Version Numbers:
    PluginAbout 6.0.0
    PluginCodeStyleChecker 6.0.0
    PluginEricapi 6.0.0
    PluginEricdoc 6.0.0
    PluginSyntaxChecker 6.0.0
    PluginTabnanny 6.0.0
    PluginVcsMercurial 6.0.0
    PluginVcsPySvn 6.0.0
    PluginVcsSubversion 6.0.0
    PluginVmListspace 6.0.0
    PluginVmTabview 6.0.0
    PluginWizardE5MessageBox 6.0.0
    PluginWizardPyRegExp 6.0.0
    PluginWizardQColorDialog 6.0.0
    PluginWizardQFileDialog 6.0.0
    PluginWizardQFontDialog 6.0.0
    PluginWizardQInputDialog 6.0.0
    PluginWizardQMessageBox 6.0.0
    PluginWizardQRegExp 6.0.0
    PluginWizardQRegularExpression 6.0.0

    File: D:\Program Files\Python\Python34\Lib\site-packages\eric6\eric6.py
    Line: 167
    Function: excepthook

    怎么解决啊??

      • witch1990
      • 2016/02/16 9:50上午

      你那个问题解决了没 为什么
      [em_zan]

      • witch1990
      • 2016/02/16 9:50上午

      你那个问题解决了没?怎么解决的?
      [em_zan]

    • 出血
    • 2016/11/29 9:50下午

    字体设置了中文名称的居然编译就不通过了。。 [em_jiong]

    • 唐小gun
    • 2017/07/10 11:08上午

    楼主你好,请问你有文本输入框的详细使用方法吗,我在网上找到的代码都没有能看懂的

    • ylj
    • 2018/01/02 4:59下午

    通常是字体为中文字体格式导致的,改下设置看看

    • YANG
    • 2021/12/09 7:23下午

    # -*- coding: utf-8 -*-
    import sys
    from PyQt6 import QtWidgets
    from PyQt6.QtCore import pyqtSlot
    from Ui_pyqtdemo import Ui_Dialog
    class Pyqtdemo(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent = None):
    QtWidgets.QDialog.__init__(self, parent)
    self.setupUi(self)

    @pyqtSlot()
    def on_btn_1_clicked(self):
    self.label.setText(u”按钮1被按下!”)
    @pyqtSlot()
    def on_btn_2_clicked(self):
    self.label.setText(u”按钮2被按下!”)
    @pyqtSlot()
    def on_Button_OK_clicked(self):
    self.label.setText(‘这是我的第一个 PyQt6 程序’)

    if __name__ == “__main__”:
    app =QtWidgets.QApplication(sys.argv)
    dlg = Pyqtdemo()
    dlg.show()
    sys.exit(app.exec())

  1. 2015/08/17
[em_zan] [em_yali] [em_xiao] [em_xhj] [em_tucao] [em_tu] [em_tiaopi] [em_sx] [em_sdz] [em_sbq] [em_mobai] [em_kzh] [em_ku] [em_ksh] [em_keai] [em_jiong] [em_jing] [em_hx] [em_han] [em_ganga] [em_daxiao] [em_cool] [em_chi] [em_bu] [em_bizui] [em_ai]

return top