“云”端的语雀:用 JavaScript 全栈打造商业级应用
PyQt5的学习
花费了一个下午把PyQt5大概的学习了下。找了一个教程 PyQt5教程 跟着挨着把上面的案例做了一遍,大概知道PyQt5是如何生成窗体,以及控件的。基本上做到如果有需求要实现,查查手册,搜搜百度能实现的水平。
另外强烈推荐:PyQt5图形界面编程
PyQt5就是python的GUI库,用它来做一些桌面软件,是QT的python版本。具体的简介就不赘述了。记录点自己学习的干货。
使用大概流程
首先当然是安装PyQt5的类库
pip3 install PyQt5
PyQt5的使用
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI() #界面绘制交给InitUi方法
def initUI(self):
#设置窗口的位置和大小
self.setGeometry(300, 300, 300, 220)
#设置窗口的标题
self.setWindowTitle('Icon')
#设置窗口的图标,引用当前目录下的web.png图片
self.setWindowIcon(QIcon('web.png'))
#显示窗口
self.show()
if __name__ == '__main__':
#创建应用程序和对象
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
然后几乎就可以跑出来一个窗体了。至于窗体上的设置,几乎看着英语就能知道如何写。比如
self.setWindowTitle('设置标题')
self.setWindowIcon(QIcon('web.png')) #设置icon图标
常见的组件
- QCheckBox
- QPushButton
- QSlider
- QProgressBar
- QCalendarWidget
- QPixmap
- QLineEdit
- QSplitter
- QComboBox
以上是这个教程上讲到的控件。控件部分个人认为不需要花费时间去研究,如果用到了查查,经常用到了,自然能记得住。没必要深入研究。
要使用一个组件,直接实例化,然后parent指定为当前的对象。就会出现在当前对象上
button = QButton('按钮名称',self)
#然后设置一些组件的特性并且把组件触发的时间插入插槽就可以了,插槽接下来讲解
button.move(200,100)
button.clicked.connect(self.button_click)
信号和插槽 Signal&slot
这个应该算是重点了,因为UI最后还是要接受用户的点击、输入,要有事件产生并且能有处理事件的函数和方法。类似C#中的事件委托一样。
插槽
要处理一个事件,比如一个按钮的事件我们用插槽接受事件信号。如下伪代码
浏览器从输入url 到页面展示完成响应过程
button.clicked.connect(self.button_click)
#插槽
def button_click(self):
#被点击执行的代码
#信号的发送者
sender = self.sender()
信号与发出信号
#我们需要定义一个发送信号的对象
class Communicate(QObject):
closeApp = pyqtSignal()
#在发送信号的窗体类代码
class Example(QMainWindow):
def __init__(self):
self.c = Communicate()
def mousePressEvent(self, event):
#出发信号的发送
self.c.closeApp.emit()
另外还有几个问题需要进一步思考:
- 发送如何写在类中,比如自定义一个控件,然后这个类出发事件,可以给别的类调用实例化的对象的时候处理?
-
信号槽如何发送带参数的消息。
对话框
- QInputDialog
- QColorDialog
- QFontDialog
- QFileDialog
-
QMessageBox
个人认为对话框没有太多需要讲解的。用到了查查,知道如何弹出,如何获得弹出后操作的结果就可以了。
关于窗体如何弹出。每一个集成了QWidget的窗体,都会有一个show方法,在需要弹出的地方调用他们就可以弹出了。
模态窗体
方法 | 说明 |
---|---|
setWindowModality() | Qt.NonModal:非模态,可以和程序的其他窗口进行交互 |
Qt.WindowModal:窗口模态,程序在未处理玩当前对话框时,将阻止和对话框的父窗口进行交互 | |
Qt.ApplicationModal:应用程序模态,阻止和任何其他窗口进行交互 |
绘图
如果要自定义控件,少不了需要做绘图。
python的控件会自动调用paintEvent事件。所以只需要调用paitEvent事件,就可以做到绘图。
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
self.drawText(event, qp)
qp.end()
而paintEvent会在需要控件重绘的时候,进行调用,如果要强制重汇。需要在这个方法中调用:
.update()
自定义控件
通过可视化的方法设计GUI
参考
ConcurrentHashMap源码解析 JDK8