在学过网站之后,对于这个其实大同小异,相对应的都有差不多的版块,个人觉得这个要简单很多
这两个模块用到现在,在使用上并没有碰到什么区别,只是import不同,协议不同,一个可以商用闭源,一个必须开源。如果有不同的意见欢迎评论。
在安装时碰到的坑,先用的pyqt5,后装的pyside2
qt5并没有碰到过什么问题,但在安装后者是无法运行,会报错
this application failed to start because no qt platform plugin could....
大概就是说缺少这些东西,reinstall会管用,然后我就觉得这个小东西在放****
我又尝试了网上的n多种方法,都无法解决我的问题......淦
其中有一个还让pt5不能用了...
然后我在虚拟机上装上side2,可以用,然后在主机上把qt5调回能用,我觉得可能是side2和qt5不能共存,如果有明白人看到这,留个言,蟹蟹!!!
其他相关内容自己百度去
=_=
梳理:
首先呢,界面编程有一个固定写法,为了不重复写这些东西,先设置一个关键字模板。
上图~~
打开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,按需自行修改
一个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) 对象被销毁时
待更........