前面一篇介绍了页面的绘制和后台主要框架的代码,接下来介绍一下信号和槽的关联。信号和槽是QT的核心机制,信号,是指鼠标和键盘上的各种操作事件,槽是从英文单词slot里翻译过来的,查了一下这个单词的含义,按划红线处的理解比较合适,即指不同的信号发生后,我们调用对应处置的方法。
信号和槽的实现,需要了解各类控件有哪些信号,需要的时候,也可以自定义信号,下面以QTextEdit和QPushButton为例来介绍如何实现信号槽的联动
编写信号和槽
QTextEdit类是一个多行文本控制控件,可以显示多行文本内容,当文本超出控件的显示范围时,会自动生成垂直滚动条。
常用的方法如下:
QPushButton是普通的按钮
我们想设计一个小工具,从第一个QTextEdit里输入json字符串,从第二个QTextEdit输入jsonpath表达式,用最后一个框QTextBrowser显示jsonpath表达式提取的结果。
根据我们的工具需求,设计的信号和槽,大体应该是,点击QPushButton的时候,获取两个QTextEdit里输入的字符串,进行jsonpath的提取,最终回显在QTextBrowser上。
信号和槽的写法如下
self.pushButton.clicked.connect(self.get_value)
这里的信号就是对QPushButton的clicked动作,connect链接到对应的槽,即要做什么,get_value是一个方法,但是这里注意不需要括号
最小集代码如下(未做异常处理)
import sys
import jsonpath
import json
from PyQt5.QtWidgets import *
from pjsonpath.Ui_pjsonpath import *
class MyMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.get_value)
def get_value(self):
'''
匹配Jsonpath结果
:param source_str: 目标字符串
:param pattern: jsonpath表达式
:return: 匹配结果
'''
source_str = self.textEdit.toPlainText()
pattern = self.textEdit_2.toPlainText()
if not pattern.startswith("$."):
write_result("JSONPATH表达式格式错误!")
raise Exception("JSONPATH表达式格式错误!")
result = jsonpath.jsonpath(json.loads(source_str), pattern)
self.printf("匹配到如下结果,共{}条记录:\n\n{}".format(len(result) if result!=None else 0,'\n'.join([str(r) for r in result]) if result!=None else "null"))
def printf(self,mypstr,logtype = None):
'''文本框输出
'''
self.textBrowser.append(mypstr)
self.cursor=self.textBrowser.textCursor()
self.textBrowser.moveCursor(self.cursor.End)
QtWidgets.QApplication.processEvents()
if __name__ == '__main__':
app = QApplication(sys.argv)
q = MyMainWindow()
q.show()
sys.exit(app.exec())
执行后效果如图
基本的流程完成后,则可以对这个小工具做一些异常处理,界面优化等工作,下篇再继续