pyside2 与pyqt5 part1

在学过网站之后,对于这个其实大同小异,相对应的都有差不多的版块,个人觉得这个要简单很多

这两个模块用到现在,在使用上并没有碰到什么区别,只是import不同,协议不同,一个可以商用闭源,一个必须开源。如果有不同的意见欢迎评论。

在安装时碰到的坑,先用的pyqt5,后装的pyside2

qt5并没有碰到过什么问题,但在安装后者是无法运行,会报错

this application failed to start because no qt platform plugin could....

大概就是说缺少这些东西,reinstall会管用,然后我就觉得这个小东西在放****

我又尝试了网上的n多种方法,都无法解决我的问题......淦

其中有一个还让pt5不能用了...

然后我在虚拟机上装上side2,可以用,然后在主机上把qt5调回能用,我觉得可能是side2和qt5不能共存,如果有明白人看到这,留个言,蟹蟹!!!

其他相关内容自己百度去

=_=

 qt5为例

梳理:

  • 各种控件的特性和使用
  • 控件样式
  • 资源加载
  • 控件布局
  • 事件和信号
  • 动画
  • 跳转
  • designer
  • 网络
  • 多线程
  • 数据库
  • 文件操作
  • 绘图
  • 多媒体
  • 定时器
  • 定位........

首先呢,界面编程有一个固定写法,为了不重复写这些东西,先设置一个关键字模板。

上图~~

打开setting,搜索live

选择python 

点击+号

 关键字,介绍, 正文

写完后点击define,选择python

ok~~

 1 $输入模板后光标停着的位置$
 2 
 3 from PyQt5.QtWidgets import QApplication, QWidget
 4 import sys
 5 
 6 # 创建用用程序对象
 7 app = QApplication(sys.argv)
 8 # 创建控件
 9 window = QWidget()
10 # 控件设置
11 window.setWindowTitle('$TITLE$')
12 window.resize(500, 500)
13 $CODE$
14 # 展示控件
15 window.show()
16 # 进入消息循环
17 sys.exit(app.exec_())
一般
 1 from PyQt5.QtWidgets import QWidget, QApplication
 2 
 3 
 4 class Window(QWidget):
 5     def __init__(self):
 6         super().__init__()
 7         self.setWindowTitle('dui')
 8         self.resize(500, 500)
 9         self.setup_ui()
10 
11     def setup_ui(self):
12         pass
13 
14 
15 if __name__ == '__main__':
16     import sys
17     app = QApplication(sys.argv)
18 
19     window = Window()
20     window.show()
21 
22     sys.exit(app.exec_())
面向对象
 1 from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow
 2 import untitled
 3 
 4 
 5 class Window(QMainWindow):
 6     def __init__(self):
 7         super().__init__()
 8         self.setWindowTitle('dui')
 9         self.resize(500, 500)
10 
11     def setupUi(self, MainWindow):
12         a = untitled.Ui_MainWindow()
13         a.setupUi(MainWindow)
14 
15 
16 
17 if __name__ == '__main__':
18     import sys
19 
20     app = QApplication(sys.argv)
21 
22     window = Window()
23     def sd():
24         print('w')
25     window.__setattr__('sd', sd)
26     window.setupUi(window)
27     window.show()
28 
29     sys.exit(app.exec_())
30 
31 
32 
33 # 创建的QMainWindow,所以继承自QMainWindow,按需自行修改
designer

 一个pyqt5程序都需要应用程序对象,它包含主事件循环,在其中来自窗口系统和其他资源的所有事件被处理和调度。它也处理应用程序的初始化和结束,并提供对话管理。处理绝大多数系统范围和应用程序范围的设置。

app.exec_()让程序进入主循环,不要停

一个没有父对象的控件默认不显示,需要调用show()

一个程序中可以显示多个顶级控件:没有父控件就是顶级控件(有标题栏,可以设置图标,标题,有最大化,最小化,关闭等操作)   父子关系,父辈展示,子一般会自动展示。

常用包介绍
QtWidgets 包含了一整套UI元素控件,用于建立符合系统风格的界面
QtGui 涵盖多种基本图形功能,字体,图形,图标颜色...
QtCore  包的核心非GUI功能,时间,文件, 目录, 数据类型,线程进程...
QtWebKit 浏览器引擎
QtTest 测试
QtSql 数据库
QtMultimedia 多媒体
QtMultimediaWidgets 多媒体
... ...

一个还好用的icon库    qtawesome       https://pypi.org/project/QtAwesome/

开发中用的最多的应该是designer吧,就先来说说这个配置吧。

这个可以在文件中直接打开,也可以配置  external tools

上图~~

 点+号

 program是designer的路径,working directory是工作目录,填这个就可,可点insert找

配置转码

arguments:   -m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py

找到菜单栏的Tools中的 external tools中刚配置好的designer

 至此,就配置好了

控件    看源码

1.Qobject基类       这是为了记录部分常用公有的API。

对象名称属性
setObjectName('唯一名称') 给qt对象设置一个名称  类似  id
objectName() 获取
setProperty(''属性名称'', 值) 给qt对象设置一个属性  类似  class
property('属性名称') 获取
dynamicPropertyNames() 获取一个对象中所有通过setProperty()设置的属性
父子
setParent(parent) 给qt对象设置父对象   只能有一个
parent() 获取父对象
children() 获取所有子对象
findChild(a, [b], c) 获取某个指定名称和类型的子对象
findChildren(a, [b], c) 获取多个指定名称和类型的子对象

参数:a: 类型, 类型元组   QObject       (QPushButton,QLabel)

      b:名称,可省略

           c: 查找方式:Qt.FindChildrenRecursively(递归查找,默认)

         Qt.FindDirectChildrenOnly(只查找直接子对象)

内存管理机制:QObject:1.所有对象都直接或间接继承自QObject

            2.当创建一个QObject时,如果使用了其他对象作为父对象,那么会添加到父对象的children()列表中

            3.当父对象被销毁时,这个QObject也会被销毁

      

      控件,QWidget:当一个控件设置了父控件,会包含在父控件内部,受父控件区域剪裁,在父控件被删除时,子控件会自动删除

如果一个控件没有父控件,那么就会被当成顶层控件       多个顶层控件互相独立

如果想要一个控件包含在另一个控件内部,就需要设置父子关系      显示位置,生命周期都受父对象约束

信号处理
widget.信号.connect(槽) 连接信号与槽
obj.disconnect() 取消连接  obj(控件,信号):取消控件所有连接,取消指定信号的连接
widget.blockSignals(bool) 临时阻止指定控件的所有信号与槽连接
widget.signalsBlocked() 信号是否被阻止
widget.receivers(信号) 返回连接到信号的接收器数量

信号:内置:QpushButton().pressed

        QpushButton().clicked

           .......

    自定制:pyqtSignal()

特性:
  一个信号可以连接多个槽函数
  一个信号也可以连接另外一个信号
  信号的参数可以是任何Python类型
  一个槽可以监听多个信号
  ...

事件机制:

  childEvent(),customEvent(),eventFilter(),installEventFilter(),removeEventFilter(),event()

一般情况下,通过内置的信号与槽就可解决一般通讯问题,但有些控件并没有提供我们想要的信号,我们就需要重写具体的事件函数来捕获产生的事件,做相应处理。QLabel没有clicked信号

某些场景并不会把我们想要捕获的事件传递给特定函数,那么我们就需要重写事件的分发函数event()。   按下tab键切换焦点不会吧事件分发给keyPressEvent

如果对多个不同对象进行tab捕获,为了不多次重写,就需要考虑’事件过滤器‘

QApplication对象的事件过滤器可以拦截所有QObject事件,一般没卵用,notify()会降低性能

如果一个控件没有处理某事件则会自动传递给父控件处理,对此有两个方法accept(),ignore()  前者:自己处理了事件,并告诉系统不要上传,后者:自己忽略了事件,告诉系统继续上传

类型判定:

  isWidgetType():是否为控件类型 继承自QWidget类的

  inherits(父类): 一个对象是否继承(直接或间接)自某个类

对象删除:

  obj.deleteLater()   

    删除一个对象时,会解除它与父对象的关系,此方法是向主消息循环发送一个event,下一次主消息循环收到这个event之后才会销毁对象,在删除前可做一些操作,但内存将不会释放

定时器
startTimer(ms, Qt.TimerType)     ->timer_id 开启定时器
killTimer(timer_id) 杀死定时器
timerEvent() 定时器执行事件

Qt.TimeType:   Qt.PreciseTimer:  精确定时器,ms

         Qt.CoarseTimer:粗定时器,5%误差

                         Qt.VeryCoarseTimer:很粗定时器, s

语言翻译:  tr()

信号:oblectNameChanged(objectName)   对象名称发生改变时

      destroyed(obj)   对象被销毁时  

        

待更........

原文地址:https://www.cnblogs.com/JcrLive/p/12548705.html