pyside2 与pyqt5 part1
在学过网站之后,对于这个其实大同小异,相对应的都有差不多的版块,个人觉得这个要简单很多
这两个模块用到现在,在使用上并没有碰到什么区别,只是import不同,协议不同,一个可以商用闭源,一个必须开源。如果有不同的意见欢迎评论。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
在安装时碰到的坑,先用的pyqt5,后装的pyside2
qt5并没有碰到过什么问题,但在安装后者是无法运行,会报错
this application failed to start because no qt platform plugin could....
大概就是说缺少这些东西,reinstall会管用,然后我就觉得这个小东西在放****
我又尝试了网上的n多种方法,都无法解决我的问题......淦
其中有一个还让pt5不能用了...
然后我在虚拟机上装上side2,可以用,然后在主机上把qt5调回能用,我觉得可能是side2和qt5不能共存,如果有明白人看到这,留个言,蟹蟹!!!
其他相关内容自己百度去
=_=
qt5为例
梳理:
- 各种控件的特性和使用
- 控件样式
- 资源加载
- 控件布局
- 事件和信号
- 动画
- 跳转
- designer
- 网络
- 多线程
- 数据库
- 文件操作
- 绘图
- 多媒体
- 定时器
- 定位........
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) 对象被销毁时
待更........
