• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

PyQt5-QtDesigner入门

武飞扬头像
hansy
帮助2

程序的用户交互界面,英文称之为 UI (user interface)

当一个应用的 UI 比较复杂的时候,命令行方式就不便用户使用了,这时我们需要图形界面。

python图形界面开发

如果用 Python 语言开发 跨平台 的图形界面的程序,主要有3种选择:

  • Tkinter

    基于Tk的Python库,这是Python官方采用的标准库,优点是作为Python标准库、稳定、发布程序较小,缺点是控件相对较少。

  • wxPython

    基于wxWidgets的Python库,优点是控件比较丰富,缺点是稳定性相对差点、文档少、用户少。

  • PySide2、PyQt5

    基于Qt 的Python库,优点是控件比较丰富、跨平台体验好、文档完善、用户多。

    缺点是 库比较大,发布出来的程序比较大。

如果我们要开发的工具较小,界面比较简单,那我们可以选择Tkinter,如果控件较多功能较复杂,我们可以采用采用基于Qt的PySide2、PyQt5。

PySide2、PyQt5 简介

PySide2、PyQt5 都是基于著名的 Qt 库。

Qt库里面有非常强大的图形界面开发库,但是Qt库是C 语言开发的,PySide2、PyQt5可以让我们通过Python语言使用Qt。

但是 PySide2、PyQt5 这两者有什么区别呢?

可以形象地这样说: PySide2 是Qt的 亲儿子 , PyQt5 是Qt还没有亲儿子之前的收的 义子 (Riverbank Computing这个公司开发的)。

那为什么 PyQt5 这个义子 反而比 PySide2 这个亲儿子更出名呢?

原因很简单:PySide2 这亲儿子最近(2018年7月)才出生。

但是亲儿子毕竟是亲儿子,Qt准备大力培养,PySide2 或许更有前途。

已经在使用 PyQt5 的朋友不要皱眉, 两个库的使用 对程序员来说,差别很小:它们的调用接口几乎一模一样。

如果你的程序是PyQt5开发的,通常只要略作修改,比如把导入的名字从 PyQt5 换成 PySide2 就行了。反之亦然。

以下内容只讨论PyQt5 。

安装PyQt5

如果你选择PyQt5,直接执行

pip install pyqt5-tools

即可同时安装 PyQt5 和 一些重要的工具,比如 Qt designer。

Qt Designer 使用

当控件较多时,再手写前端代码就比较费时,我们应该把大多数时间放在后端逻辑代码的优化上。除此之外,很多时候代码运行时界面呈现的样子并不是我们想要的,可能控件位置有偏差,可能觉得这种布局并没有那么好看,需要反复修改代码再运行预览。效率很低。

其实,我们可以用QT界面生成器 Qt Designer ,拖拖拽拽就可以直观的创建出程序大体的界面。

怎么运行这个工具呢?

运行 Python安装目录下 Scripts\pyqt5designer.exe 这个可执行文件。

学新通从左侧拖拽控件到右侧面板上进行界面设计,类似于Dreamvear。设计完成后生成一个.ui文件,里面是一个XML格式的界面定义。

比如设计界面如下(仅一个按钮):

学新通

图形保存为一个ui文件,如下。

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>464</width>
    <height>422</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>200</x>
     <y>150</y>
     <width>61</width>
     <height>61</height>
    </rect>
   </property>
   <property name="text">
    <string>button</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

有两种方法来使用这个.ui文件。

一、动态加载UI文件

有了界面定义文件,我们就可以用一个Python程序来从文件中加载UI定义,并且动态创建一个相应的窗口对象,并“激活”窗口中的控件。

如下:

from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.uic import loadUi
import sys

class MyMainForm(QWidget):
    def __init__(self):
        super().__init__()
        loadUi("D:\\test\\1\\test.ui", self)  #加载UI文件到self
        #self.resize(600,800)
        self.setFixedSize(550,550)   # 固定大小
        self.slot_init()             # 初始化槽函数
    
    '''初始化所有槽函数'''
    def slot_init(self):
        self.pushButton.clicked.connect(self.AA)
     
    # 函数示例
    def AA(self):
        print('hello')

if __name__=='__main__':
    app=QApplication(sys.argv)
    w=MyMainForm()
    w.show()
    sys.exit(app.exec_())

运行结果:弹出刚才设计的界面,每点击一次按钮,就输出一句hello

二、转化UI文件为Python代码

还有一种使用UI文件的方式:先把UI文件直接转化为包含界面定义的Python代码文件,然后在你的程序中使用定义界面的类

pyuic5 -x Frame.ui -o Frame.py

这样就可以得到一个Frame.py文件,运行这个python代码就可以得到刚刚设计的界面,但点击按钮不会有反应,想要“激活”这个按钮,仍需要另一个python代码。

如下:

from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
from Frame import Ui_Form

class MyMainForm(QMainWindow, Ui_Form):
    def __init__(self):
        super(MyMainForm, self).__init__()
        self.setupUi(self)

        self.setFixedSize(550,550)   # 固定大小
        self.slot_init()             # 初始化槽函数
        

    def slot_init(self):
        self.pushButton.clicked.connect(self.AA)


    def AA(self):
        print('hello')


if __name__=='__main__':
    app=QApplication(sys.argv)
    w=MyMainForm()
    w.show()
    sys.exit(app.exec_())

运行结果:弹出刚才设计的界面,每点击一次按钮,就输出一句hello

那么我们该使用哪种方式比较好呢?动态加载还是转化为Python代码?

通常采用动态加载比较方便,因为改动界面后,不需要转化,直接运行,特别方便。

但是,如果 你的程序里面有非qt designer提供的控件, 这时候,需要在代码里面加上一些额外的声明,而且可能还会有奇怪的问题。往往就要采用 转化Python代码的方法。

本篇文章来至:学新通

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通
  • 本文地址: https://www.swvq.com/boutique/detail/tanhcjikjg
  • 联系方式: luke.wu#vfv.cc
系列文章
更多 icon
同类精品
更多 icon
我要评论
我的头像
精彩评论
继续加载