MrYx为了应对实验,这三天就囫囵吞枣学习了Pyqt5方面知识,总的来说py语言简洁,库多好用,Qtdesign画界面也很爽,还是有点趣。估计以后再也不会用pyqt方面的东西,写一下博客记这几天学的东西资源,以后再用的时候再看这篇博客学习吧。
首先搭建开发环境:本人是win10系统,py3.6语言环境。
安装过程主要参考:教程1与教程2,1写的非常详细,2里面的Qtdesign,Pyuic,pydcc三个Tool在开发过程中非常好用,强烈安利。
注意:我在配置pyrcc5.exe的路径和教程不一样,我是在python/scripts目录下。
首先这个代码编写风格是很方便的,因为当你后期美化修改页面的时候,只用考虑页面设计代码,并不用修改界面按钮的功能实现代码。具体方法
最简单控件label(视频)
交互button(视频)
多行文本框textbrowser
消息框QMessageBox
标准输入框QInputDialog
标准文件打开保存框QFileDialog
添加菜单栏(视频)
PyQt4 QListWidget 使用教程
…..待补充其他控件我没怎么用到,也没去学。
信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。它为高层次的事件处理自动生成所需要的附加代码。在我们所熟知的很多 GUI 工具包中,窗口小部件(widget)都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了.
我写实验过程主要用到信号槽机制解决以下两个问题:
1.控件绑定槽函数实现控件功能。
2.自定义信号,实现多个窗口之间互相发送信息。:
我是通过给发送信息的窗口定义一个信号变量:eg:A_signature=QtCore.pyqtSignal(list)
在接收窗口里实例化一个发送窗口,并用接受窗口里某个函数接受这个发送窗口的信号,接收的函数就叫槽函数。
例如:在一个窗口输入a,b两个数,利用信号传到到另一个窗口的槽函数。
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from input import Ui_input
import answer_f
#这是输入两个数的窗口功能代码,界面代码就不放了
class input_ui(QtWidgets.QWidget,Ui_input):#继承了界面窗口Ui_input
a_signal=QtCore.pyqtSignal(str,str)#定义信号,传递两个str类型的参数
def __init__(self):
super(input_ui, self).__init__()
self.setupUi(self)
self.cal.clicked.connect(self.click)
self.win = answer_f.answer_ui()
self.a_signal.connect(self.win.printans)#将信号与希望接受到它内容的槽函数绑定起来
def click(self):
a=self.input1.text()
b=self.input2.text()
self.a_signal.emit(a,b)#发射信号,同时触发绑定函数执行。
self.win.show()
if __name__ == '__main__':
app=QtWidgets.QApplication(sys.argv)
win=input_ui()
win.show()
sys.exit(app.exec_())
接收界面
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from answer import Ui_answer
import input_f
class answer_ui(QtWidgets.QWidget,Ui_answer):
def __init__(self):
super(answer_ui, self).__init__()
self.setupUi(self)
def printans(self,a,b):#接受a_signal信号的槽函数,注意变量类型要一一对应
ans=int(a)+int(b)
ans=str(ans)
self.label_ans.setText('结果是:'+ans)
通过网络视频课程学会在qtdesign修改label等控件的样式表,非常方便。
我在写点菜界面调语音识别api时候发现当一个界面某个功能需要执行很长时间,界面就会无响应,应该就是多线程的问题,查阅到这个教程很快解决了。简单来说就是重新写一个从QtCore.QThread继承的类,在其run()方法里放进耗时比较长的工作。
看这个网络视频课程
以上学习资源基本都来自于以下链接,感谢他们付出:
http://blog.csdn.net/seeground/article/category/5880801
http://blog.csdn.net/a359680405/article/details/45167225
http://www.maiziedu.com/course/577/