这段时间公司有个项目使用到了MQTT的协议与智能硬件终端进行通信,需要对通讯协议进行验证,正好这段时间一直在研究PYQT,正好写个GUI小工具,给测试组的同事们使用
主界面
主界面主要实现Publish和Subscribe 消息订阅和发送,使用了PAHO的mqtt库,我这边主要是实现了一个界面的封装
设置界面
设置界面主要是使用了python自带的sqlite数据库保存用户连接MQTT服务器时的一些个性化参数,用户可以对自己的保存的连接进行个性化命名,选中相应的连接,点击ok即可
整个小工具去掉库文件,自己实现的代码在1000行左右,只是一个初级版本,其中ConfigDialog.py就是设置页面编码,mtest.py是主界面的编码,mqttimage文件是一些图片的集合,对PYQT不是很了解的同学可以去查阅一下相关资料。
上代码
ConfigDialog.py
from PyQt4 import QtCore, QtGui
import random, mqttimage
import sqlite3, sys, os
# from PyQt4.QtGui import *
# from PyQt4.QtCore import *
from PyQt4.Qt import QMessageBox, QRegExpValidator
QtCore.QTextCodec.setCodecForTr(QtCore.QTextCodec.codecForName("utf8"))
childlist=[]
user=''
class ConfigDialog(QtGui.QDialog):
def __init__(self, parent=None):
super(ConfigDialog, self).__init__(parent)
self.setWindowFlags(QtCore.Qt.Window) #设置最大化最小化按钮
self.setWindowTitle(self.tr("设置"))
self.resize(800,450)
QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Cleanlooks'))#设置整体风格
QtGui.QApplication.setPalette(QtGui.QApplication.style().standardPalette())#设置整体风格
mainSplitter = QtGui.QSplitter(QtCore.Qt.Horizontal,self)
amendPushButton = QtGui.QPushButton(self.tr("OK"))
closePushButton = QtGui.QPushButton(self.tr("Cancel"))
self.applyPushButton = QtGui.QPushButton(self.tr("Save"))
self.applyPushButton.setDisabled(True)# 初始化save不可用
buttonLayout = QtGui.QHBoxLayout()
buttonLayout.addStretch(9)
buttonLayout.addWidget(self.applyPushButton)
buttonLayout.addWidget(amendPushButton)
# buttonLayout.addWidget(closePushButton)
addButton = QtGui.QPushButton(self.tr(""))
addButton.setFlat(True)
addButton.setIcon(QtGui.QIcon(":img/image/plus.png"))
delButton = QtGui.QPushButton(self.tr(""))
delButton.setFlat(True)
delButton.setIcon(QtGui.QIcon(":img/image/minus.png"))
buttonLayout1 = QtGui.QGridLayout()
buttonLayout1.addWidget(addButton,0,0)
buttonLayout1.addWidget(delButton,0,2)
self.treeWidget = QtGui.QTreeWidget()
self.treeWidget.setColumnCount(1)#设置列数1
self.treeWidget.setHeaderLabels([self.tr("Connections")])
self.root= QtGui.QTreeWidgetItem(self.treeWidget)
self.root.setText(0,self.tr("Profile"))
self.treeWidget.expandAll() #节点全部展开
treeLayout = QtGui.QVBoxLayout()
treeLayout.addWidget(self.treeWidget)
treeLayout.addLayout(buttonLayout1)
self.Param1 = Param()
rightQSplitter = QtGui.QFrame(mainSplitter)
stack = QtGui.QStackedWidget()
stack.setFrameStyle(QtGui.QFrame.Panel|QtGui.QFrame.Raised)
stack.addWidget(self.Param1)
mainLayout_1 = QtGui.QHBoxLayout()
mainLayout_1.addLayout(treeLayout)
mainLayout_1.addWidget(stack)
mainLayout = QtGui.QVBoxLayout(rightQSplitter)
mainLayout.setMargin(1)
mainLayout.setSpacing(6)
mainLayout.addLayout(mainLayout_1)
Layout = QtGui.QVBoxLayout()
Layout.addWidget(mainSplitter)
Layout.addLayout(buttonLayout)
self.setLayout(Layout)
self.initDB()#初始化数据库
'''槽函数'''
amendPushButton.clicked.connect(self.accept)
closePushButton.clicked.connect(self.reject)
self.applyPushButton.clicked.connect(self.apply)
addButton.clicked.connect(self.add)
delButton.clicked.connect(self.delete)
self.connect(self.treeWidget, QtCore.SIGNAL("itemClicked(QTreeWidgetItem*,int)"),self.data_query)
''''''
def getsetdata(self):
self.ProfileName = self.Param1.nameEdit.text()
self.Host = self.Param1.HostEdit.text()
self.portValue = self.Param1.portSpinbox.value()
self.keepValue = self.Param1.keepaliveSpinbox.value()
self.client = self.Param1.ClientEdit.text()
self.user = self.Param1.tab.gen.UserEdit.text()
self.password = self.Param1.tab.gen.PassWordEdit.text()
self.visionValue = self.Param1.tab.gen.visionComboBox.currentText()
self.cleanssionValue = self.Param1.tab.gen.CleanSessionComboBox.currentText()
if self.cleanssionValue =='True':
self.cleanssion = True
# print self.cleanssion
else:
self.cleanssion = False
# print self.cleanssion
self.napsBooL = self.Param1.tab.gen.groupBox.isChecked()#namepassword 框是否勾选
self.pascheck = self.Param1.tab.gen.checkBox1.checkState()
return self.ProfileName, self.Host, self.portValue, self.keepValue, self.client, self.user, self.password, self.visionValue, self.cleanssion, self.napsBooL, self.pascheck
def data_query(self, QTreeWidgetItem, int):
global rot
parent = QTreeWidgetItem.parent()
if parent == -1:
return 1
elif parent == None:
self.Param1.nameEdit.setText('')
self.Param1.HostEdit.setText('')
self.Param1.portSpinbox.setValue(0)
self.Param1.keepaliveSpinbox.setValue(0)
self.Param1.ClientEdit.setText('')
self.Param1.tab.gen.UserEdit.setText('')
self.Param1.tab.gen.PassWordEdit.setText('')
self.applyPushButton.setDisabled(True)
else:
try:
rot = parent.indexOfChild(QTreeWidgetItem)
self.applyPushButton.setDisabled(False)
except AttributeError:
pass
cur = self.conn.cursor()
cur.execute('SELECT * FROM MQ')
self.MQData = cur.fetchall()
cur.execute('SELECT * FROM MQ1')
self.MQData1 = cur.fetchall()
cur.close()
self.idname = childlist[rot].text(0)
# print childlist[rot].text(0)
self.index = len(self.MQData)
self.index1 = len(self.MQData1)
if self.index > 0 :
for x in range(self.index):
if self.MQData[x][0] == self.idname:
self.Param1.nameEdit.setText(self.idname)
self.Param1.HostEdit.setText(self.MQData[x][1])
self.Param1.portSpinbox.setValue(self.MQData[x][2])
self.Param1.keepaliveSpinbox.setValue(self.MQData[x][3])
self.Param1.ClientEdit.setText(self.MQData[x][4])
self.Param1.tab.gen.UserEdit.setText(self.MQData[x][5])
self.Param1.tab.gen.PassWordEdit.setText(self.MQData[x][6])
if self.MQData[x][7] == 'True':
self.Param1.tab.gen.CleanSessionComboBox.setCurrentIndex(0)
else:
self.