前言

      在写完程序之后想让程序看起来更加可视化一点,所以想看看在上面加个ui界面,记录下发生过的问题以及解决方法。
      如果发现文章哪里有问题,欢迎指正。

为什么选择pyside2呢?

      在选择库的时候看到了很多对比pyside2和pyqt5的文章。我看完总结下来就是,pyqt5更加的成熟,资料也相对更多,但是如果在你的程序里面使用了pyqt5,那你的程序必须开源,而pyside2的话就没有这个规定。(但我后来才发现如果使用动态加载ui的话好像没有影响)

使用QT disigner

       QT disigner是一个可视化开发ui的一个工具,在pyqt5和pyside2的包里面都有这个工具,在这里我们可以拖动左边的各种控件来布局我们的ui

python ui程序 python的ui_ui

加载ui

      在完成ui设计之后我们只是实现了界面,但还需要再加上控件相应的功能。我们可以将ui文件转换成python程序(网上有很多教程),再将这个程序里面生成的类导入我们的程序进行控件功能的处理,好处就是更加稳定,并且如果打包程序的话会方便点。
      还有一种就是直接在程序中动态加载ui,这样使用的好处是便于修改界面以及添加功能,可以直接利用qt设计师修改ui文件,再对相应添加的控件进行功能添加就可以了。如果使用第一种的话每次修改ui文件后都需要转换成python程序,比较麻烦。

ui界面未响应或卡死

      在添加功能之后会出现这样一种情况,就是执行一段程序的时候需要花费大量的时间,无法进行其它功能的检测以及操作。ui界面会未响应或者直接卡死。
      比如我是进行目标检测,在加载权重的时候无法进行按钮点击或者其它操作。解决方法就是使用python中threading库里面的Thread创建一个新的线程,让它来进行加载模型的操作,这样我们的主线程依旧可以进行我们的其它功能的操作。

在新线程中无法实时更新ui界面

      我们在进行多线程操作的时候,因为它是在与界面显示不同的线程中进行操作的,所以我们没有办法直接将数据更新到我们的ui界面中。这时候我们需要使用PySide2.QtCore里的Signal,QObject类。我们要先定义一个信号源的类。

python ui程序 python的ui_ide_02


      在创建好之后我们需要在界面的初始化函数里面实例化这个类,并写一个函数与这个信号连接。

python ui程序 python的ui_ui_03


      这样我们就定义好了这个信号,在下面我们就可以利用emit来调用了。

python ui程序 python的ui_ui_04


      这样就可以达到实时更新ui界面的效果了。