MQTT 小车遥控器

MQTT UI界面

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'mqtt_set.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(331, 516)
        self.gridLayout_2 = QtWidgets.QGridLayout(Dialog)
        self.gridLayout_2.setObjectName("gridLayout_2")
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout_2.addItem(spacerItem, 3, 0, 1, 1)
        self.groupBox = QtWidgets.QGroupBox(Dialog)
        self.groupBox.setObjectName("groupBox")
        self.formLayout = QtWidgets.QFormLayout(self.groupBox)
        self.formLayout.setObjectName("formLayout")
        self.label_6 = QtWidgets.QLabel(self.groupBox)
        self.label_6.setObjectName("label_6")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_6)
        self.label_5 = QtWidgets.QLabel(self.groupBox)
        self.label_5.setObjectName("label_5")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_5)
        self.User = QtWidgets.QLineEdit(self.groupBox)
        self.User.setObjectName("User")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.User)
        self.Password = QtWidgets.QLineEdit(self.groupBox)
        self.Password.setObjectName("Password")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.Password)
        self.gridLayout_2.addWidget(self.groupBox, 4, 0, 1, 2)
        self.btn_flushed = QtWidgets.QPushButton(Dialog)
        self.btn_flushed.setObjectName("btn_flushed")
        self.gridLayout_2.addWidget(self.btn_flushed, 0, 1, 1, 1)
        self.btn_1 = QtWidgets.QPushButton(Dialog)
        self.btn_1.setObjectName("btn_1")
        self.gridLayout_2.addWidget(self.btn_1, 0, 0, 1, 1)
        self.frame = QtWidgets.QFrame(Dialog)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.gridLayout = QtWidgets.QGridLayout(self.frame)
        self.gridLayout.setObjectName("gridLayout")
        self.label_3 = QtWidgets.QLabel(self.frame)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 1, 3, 1, 1)
        self.label = QtWidgets.QLabel(self.frame)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 2, 3, 1, 1)
        self.Broker_Address = QtWidgets.QLineEdit(self.frame)
        self.Broker_Address.setObjectName("Broker_Address")
        self.gridLayout.addWidget(self.Broker_Address, 1, 5, 1, 1)
        self.Client_ID = QtWidgets.QLineEdit(self.frame)
        self.Client_ID.setEnabled(True)
        self.Client_ID.setTabletTracking(False)
        self.Client_ID.setText("")
        self.Client_ID.setObjectName("Client_ID")
        self.gridLayout.addWidget(self.Client_ID, 6, 5, 1, 1)
        self.Profile_Name = QtWidgets.QLineEdit(self.frame)
        self.Profile_Name.setObjectName("Profile_Name")
        self.gridLayout.addWidget(self.Profile_Name, 2, 5, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.frame)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 6, 3, 1, 1)
        self.label_4 = QtWidgets.QLabel(self.frame)
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 8, 3, 1, 1)
        self.Broker_Port = QtWidgets.QLineEdit(self.frame)
        self.Broker_Port.setObjectName("Broker_Port")
        self.gridLayout.addWidget(self.Broker_Port, 8, 5, 1, 1)
        self.label_7 = QtWidgets.QLabel(self.frame)
        self.label_7.setObjectName("label_7")
        self.gridLayout.addWidget(self.label_7, 9, 3, 1, 1)
        self.Keep_Alive = QtWidgets.QLineEdit(self.frame)
        self.Keep_Alive.setObjectName("Keep_Alive")
        self.gridLayout.addWidget(self.Keep_Alive, 9, 5, 1, 1)
        self.gridLayout_2.addWidget(self.frame, 2, 0, 1, 2)
        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout_2.addItem(spacerItem1, 1, 0, 1, 1)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "MQTT设置"))
        self.groupBox.setTitle(_translate("Dialog", "高级设置"))
        self.label_6.setText(_translate("Dialog", "密码"))
        self.label_5.setText(_translate("Dialog", "用户名"))
        self.btn_flushed.setText(_translate("Dialog", "刷新"))
        self.btn_1.setText(_translate("Dialog", "连接"))
        self.label_3.setText(_translate("Dialog", "MQTT服务端"))
        self.label.setText(_translate("Dialog", "连接名称"))
        self.label_2.setText(_translate("Dialog", "客户端ID"))
        self.label_4.setText(_translate("Dialog", "端口号"))
        self.Broker_Port.setText(_translate("Dialog", "8080"))
        self.label_7.setText(_translate("Dialog", "心跳"))

mqtt 连接代码


import os
import socket
import configparser
import sys

from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox, QProgressDialog
from PyQt5.QtGui import QIntValidator
from PyQt5.QtCore import QThread, pyqtSignal, Qt
from 软件界面.MQTT_Connect.mqtt_set import Ui_Dialog
import paho.mqtt.client as mqtt
import chardet

class MQTTWorker(QThread):      # MQTT连接子线程
    connect_success = pyqtSignal()
    connect_failed = pyqtSignal(str)
    message_received = pyqtSignal(str, str)

    def __init__(self, broker_address, broker_port, keep_alive, client_id, user, password, parent=None):
        super().__init__(parent)
        self.client = mqtt.Client()  # 创建 mqtt.Client 对象
        self.broker_address = broker_address
        self.broker_port = broker_port
        self.keep_alive = keep_alive
        self.client_id = client_id
        self.user = user
        self.password = password
        self.client_connected = False

    def run(self):
        try:
            self.client.on_connect = self.on_connect
            self.client.on_message = self.on_message
            result = self.client.connect(self.broker_address, int(self.broker_port), int(self.keep_alive))
            if result == mqtt.CONNACK_ACCEPTED:
                self.client_connected = True
                self.connect_success.emit()
                self.client.loop_forever()
            else:
                self.connect_failed.emit("MQTT服务器连接失败")
        except (socket.gaierror, TimeoutError) as e:
            self.connect_failed.emit(str(e))
        except BaseException as e:
            self.connect_failed.emit("连接出现错误: " + str(e))

    def on_connect(self, client, userdata, flags, rc):
        if rc == 0:
            self.connect_success.emit()
            self.client_connected = True
            self.subscribe_topic("MYK")  # 替换为你要订阅的主题
        else:
            self.connect_failed.emit("MQTT服务器连接失败")

    def on_message(self, client, userdata, msg):
        topic = msg.topic
        encoding = chardet.detect(msg.payload)['encoding']
        message = msg.payload.decode(encoding)
        self.message_received.emit(topic, message)

    def publish_message(self, topic, message):
        if self.client is not None and self.client_connected:
            self.client.publish(topic, message)

    def subscribe_topic(self, topic):
        if self.client is not None and self.client_connected:
            self.client.subscribe(topic)


class MQTT_Window(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.worker = None
        self.progress_dialog = None

        # 信号
        self.ui.btn_1.clicked.connect(self.mqtt_initiated)
        self.ui.btn_flushed.clicked.connect(self.btn_flushed_cd)

        # 设置QIntValidator限制为整数类型
        validator = QIntValidator()
        self.ui.Broker_Port.setValidator(validator)
        self.ui.Keep_Alive.setValidator(validator)

        # 读取配置文件并设置默认值
        self.load_config()

    def btn_flushed_cd(self):   #客户端刷新,可以重新输入客户端并重连
        # Reset connection status
        if self.worker is not None:
            self.worker.client.disconnect()
            self.worker.quit()
            self.worker.wait()
            self.worker = None

    def load_config(self):
        # 创建配置文件对象
        config = configparser.ConfigParser()
        config_file = os.path.join(os.path.dirname(__file__), 'config.ini')
        config.read(config_file)

        # 设置默认值
        self.ui.Profile_Name.setText(config.get('MQTT_Connect', 'Profile_Name', fallback=''))
        self.ui.Broker_Address.setText(config.get('MQTT_Connect', 'Broker_Address', fallback=''))
        self.ui.Broker_Port.setText(config.get('MQTT_Connect', 'Broker_Port', fallback=''))
        self.ui.Client_ID.setText(config.get('MQTT_Connect', 'Client_ID', fallback=''))
        self.ui.Keep_Alive.setText(config.get('MQTT_Connect', 'Keep_Alive', fallback=''))
        self.ui.User.setText(config.get('MQTT_Connect', 'User', fallback=''))
        self.ui.Password.setText(config.get('MQTT_Connect', 'Password', fallback=''))

    def mqtt_initiated(self):
        Profile_Name = self.ui.Profile_Name.text()
        Broker_Address = self.ui.Broker_Address.text()
        Broker_Port = self.ui.Broker_Port.text()
        Keep_Alive = self.ui.Keep_Alive.text()
        Client_ID = self.ui.Client_ID.text()
        User = self.ui.User.text()
        Password = self.ui.Password.text()

        # 检查输入框中的值是否为空
        if (
            Profile_Name == "" or
            Broker_Address == "" or
            Broker_Port == "" or
            Keep_Alive == "" or
            Client_ID == ""
        ):
            QMessageBox.warning(self, "输入错误", "请填写所有字段")
            return

        # 检查端口和保持连接时间是否为有效的整数
        try:
            Broker_Port = int(Broker_Port)
            Keep_Alive = int(Keep_Alive)
        except ValueError:
            QMessageBox.warning(self, "输入错误", "端口和保持连接时间必须是整数")
            return

        if self.worker is not None and self.worker.client_connected:
            QMessageBox.information(self, "提示", "已连接到 MQTT 服务器")
            return

        # 创建进度对话框
        self.progress_dialog = QProgressDialog("正在连接...", "", 0, 0, self)
        self.progress_dialog.setWindowTitle("提示")
        self.progress_dialog.setWindowModality(Qt.WindowModal)
        self.progress_dialog.setMinimumDuration(0)
        self.progress_dialog.setCancelButton(None)
        self.progress_dialog.setWindowFlags(self.progress_dialog.windowFlags() & ~Qt.WindowContextHelpButtonHint)
        self.progress_dialog.show()

        # 保存配置文件
        config = configparser.ConfigParser()
        config_file = os.path.join(os.path.dirname(__file__), 'config.ini')
        config.read(config_file)
        config.set('MQTT_Connect', 'Profile_Name', Profile_Name)
        config.set('MQTT_Connect', 'Broker_Address', Broker_Address)
        config.set('MQTT_Connect', 'Broker_Port', str(Broker_Port))
        config.set('MQTT_Connect', 'Keep_Alive', str(Keep_Alive))
        config.set('MQTT_Connect', 'Client_ID', Client_ID)
        config.set('MQTT_Connect', 'User', User)
        config.set('MQTT_Connect', 'Password', Password)
        with open(config_file, 'w') as configfile:
            config.write(configfile)

        self.worker = MQTTWorker(
            Broker_Address, Broker_Port, Keep_Alive, Client_ID, User, Password, parent=self.worker
        )
        self.worker.connect_success.connect(self.on_mqtt_connect_success)
        self.worker.connect_failed.connect(self.on_mqtt_connect_failed)
   #     self.worker.message_received.connect(self.on_mqtt_message_received)
        self.worker.start()

    def on_mqtt_connect_success(self):
        QMessageBox.information(self, "提示", "连接成功")
        self.progress_dialog.close()

    def on_mqtt_connect_failed(self, error):
        QMessageBox.warning(self, "连接失败", "连接失败: " + error)
        self.progress_dialog.close()

    def on_mqtt_message_received(self, topic, message):
        QMessageBox.information(self, "收到消息", f"主题:{topic}\n消息:{message}")

    def mqtt_publish(self, topic, message):
        if self.worker is not None:
            self.worker.publish_message(topic, message)

    def subscribe_topic(self, topic):
        if self.worker is not None:
            self.worker.subscribe_topic(topic)

    def closeEvent(self, event):
        if self.worker is not None and self.worker.isRunning():
            self.worker.client.disconnect()
            self.worker.quit()
            self.worker.wait()
        super().closeEvent(event)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    my_app = MQTT_Window()
    my_app.show()
    sys.exit(app.exec_())

Control UI

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Control.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(663, 653)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("../../../浏览器下载中心/无人驾驶*.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        Form.setWindowIcon(icon)
        self.gridLayout_3 = QtWidgets.QGridLayout(Form)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.widget = QtWidgets.QWidget(Form)
        self.widget.setObjectName("widget")
        self.gridLayout = QtWidgets.QGridLayout(self.widget)
        self.gridLayout.setObjectName("gridLayout")
        self.groupBox = QtWidgets.QGroupBox(self.widget)
        self.groupBox.setObjectName("groupBox")
        self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.pushButton_3 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout_4.addWidget(self.pushButton_3, 3, 3, 1, 2)
        self.pushButton_6 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_6.setObjectName("pushButton_6")
        self.gridLayout_4.addWidget(self.pushButton_6, 4, 4, 1, 1)
        self.Stop_btn = QtWidgets.QPushButton(self.groupBox)
        self.Stop_btn.setObjectName("Stop_btn")
        self.gridLayout_4.addWidget(self.Stop_btn, 1, 2, 1, 1)
        self.pushButton_5 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_5.setObjectName("pushButton_5")
        self.gridLayout_4.addWidget(self.pushButton_5, 4, 2, 1, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout_4.addWidget(self.pushButton_2, 3, 1, 1, 2)
        self.pushButton_8 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_8.setObjectName("pushButton_8")
        self.gridLayout_4.addWidget(self.pushButton_8, 5, 2, 1, 1)
        self.pushButton_9 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_9.setObjectName("pushButton_9")
        self.gridLayout_4.addWidget(self.pushButton_9, 5, 4, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout_4.addWidget(self.pushButton_4, 4, 0, 1, 1)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_4.addItem(spacerItem, 1, 3, 1, 1)
        self.Up_btn = QtWidgets.QPushButton(self.groupBox)
        self.Up_btn.setMaximumSize(QtCore.QSize(150, 16777215))
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("../../../浏览器下载中心/arrow-up.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.Up_btn.setIcon(icon1)
        self.Up_btn.setObjectName("Up_btn")
        self.gridLayout_4.addWidget(self.Up_btn, 0, 2, 1, 1)
        self.Back_btn = QtWidgets.QPushButton(self.groupBox)
        self.Back_btn.setMaximumSize(QtCore.QSize(150, 16777215))
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("../../../浏览器下载中心/arrow-down.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.Back_btn.setIcon(icon2)
        self.Back_btn.setObjectName("Back_btn")
        self.gridLayout_4.addWidget(self.Back_btn, 2, 2, 1, 1)
        self.Left_btn = QtWidgets.QPushButton(self.groupBox)
        self.Left_btn.setEnabled(True)
        self.Left_btn.setMaximumSize(QtCore.QSize(150, 16777215))
        icon3 = QtGui.QIcon()
        icon3.addPixmap(QtGui.QPixmap("../../../浏览器下载中心/arrow-left.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.Left_btn.setIcon(icon3)
        self.Left_btn.setObjectName("Left_btn")
        self.gridLayout_4.addWidget(self.Left_btn, 1, 0, 1, 1)
        self.pushButton = QtWidgets.QPushButton(self.groupBox)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout_4.addWidget(self.pushButton, 3, 0, 1, 1)
        self.pushButton_7 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_7.setObjectName("pushButton_7")
        self.gridLayout_4.addWidget(self.pushButton_7, 5, 0, 1, 1)
        self.Right_btn = QtWidgets.QPushButton(self.groupBox)
        self.Right_btn.setMaximumSize(QtCore.QSize(150, 16777215))
        icon4 = QtGui.QIcon()
        icon4.addPixmap(QtGui.QPixmap("../../../浏览器下载中心/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.Right_btn.setIcon(icon4)
        self.Right_btn.setObjectName("Right_btn")
        self.gridLayout_4.addWidget(self.Right_btn, 1, 4, 1, 1)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_4.addItem(spacerItem1, 1, 1, 1, 1)
        self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1)
        self.gridLayout_3.addWidget(self.widget, 1, 2, 2, 1)
        self.widget_2 = QtWidgets.QWidget(Form)
        self.widget_2.setObjectName("widget_2")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.widget_2)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.groupBox_2 = QtWidgets.QGroupBox(self.widget_2)
        self.groupBox_2.setObjectName("groupBox_2")
        self.gridLayout_5 = QtWidgets.QGridLayout(self.groupBox_2)
        self.gridLayout_5.setObjectName("gridLayout_5")
        self.textEdit = QtWidgets.QTextEdit(self.groupBox_2)
        self.textEdit.setObjectName("textEdit")
        self.gridLayout_5.addWidget(self.textEdit, 0, 0, 1, 1)
        self.gridLayout_2.addWidget(self.groupBox_2, 4, 0, 1, 1)
        self.frame = QtWidgets.QFrame(self.widget_2)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.gridLayout_6 = QtWidgets.QGridLayout(self.frame)
        self.gridLayout_6.setObjectName("gridLayout_6")
        self.comboBox_model = QtWidgets.QComboBox(self.frame)
        self.comboBox_model.setObjectName("comboBox_model")
        self.comboBox_model.addItem("")
        self.comboBox_model.addItem("")
        self.comboBox_model.addItem("")
        self.comboBox_model.addItem("")
        self.gridLayout_6.addWidget(self.comboBox_model, 0, 1, 1, 1)
        self.SpeedSpinBox = QtWidgets.QSpinBox(self.frame)
        self.SpeedSpinBox.setMaximum(255)
        self.SpeedSpinBox.setObjectName("SpeedSpinBox")
        self.gridLayout_6.addWidget(self.SpeedSpinBox, 1, 2, 1, 1)
        self.SpeedSlider = QtWidgets.QSlider(self.frame)
        self.SpeedSlider.setTabletTracking(False)
        self.SpeedSlider.setMaximum(255)
        self.SpeedSlider.setOrientation(QtCore.Qt.Horizontal)
        self.SpeedSlider.setObjectName("SpeedSlider")
        self.gridLayout_6.addWidget(self.SpeedSlider, 1, 1, 1, 1)
        self.label = QtWidgets.QLabel(self.frame)
        self.label.setObjectName("label")
        self.gridLayout_6.addWidget(self.label, 1, 0, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.frame)
        self.label_3.setObjectName("label_3")
        self.gridLayout_6.addWidget(self.label_3, 0, 0, 1, 1)
        self.gridLayout_2.addWidget(self.frame, 1, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.widget_2)
        self.label_2.setObjectName("label_2")
        self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1)
        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout_2.addItem(spacerItem2, 2, 0, 1, 1)
        self.gridLayout_3.addWidget(self.widget_2, 1, 1, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "驾驶舱"))
        self.groupBox.setTitle(_translate("Form", "手动控制"))
        self.pushButton_3.setText(_translate("Form", "滑行状态"))
        self.pushButton_6.setText(_translate("Form", "俯仰角"))
        self.Stop_btn.setText(_translate("Form", "下潜"))
        self.pushButton_5.setText(_translate("Form", "航行速度"))
        self.pushButton_2.setText(_translate("Form", "浮力系统"))
        self.pushButton_8.setText(_translate("Form", "推进器B"))
        self.pushButton_9.setText(_translate("Form", "推进器C"))
        self.pushButton_4.setText(_translate("Form", "下潜深度"))
        self.Up_btn.setText(_translate("Form", "前进"))
        self.Back_btn.setText(_translate("Form", "后退"))
        self.Left_btn.setText(_translate("Form", "左转"))
        self.pushButton.setText(_translate("Form", "自动航线"))
        self.pushButton_7.setText(_translate("Form", "推进器A"))
        self.Right_btn.setText(_translate("Form", "右转"))
        self.groupBox_2.setTitle(_translate("Form", "控制反馈"))
        self.comboBox_model.setItemText(0, _translate("Form", "遥控模式"))
        self.comboBox_model.setItemText(1, _translate("Form", "循迹模式"))
        self.comboBox_model.setItemText(2, _translate("Form", "避障模式"))
        self.comboBox_model.setItemText(3, _translate("Form", "MQTT模式"))
        self.label.setText(_translate("Form", "速度"))
        self.label_3.setText(_translate("Form", "模式选择"))
        self.label_2.setText(_translate("Form", "TextLabel"))

Control 代码

# -*- coding: utf-8 -*-
from PyQt5 import QtCore
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtCore import QTimer
from 软件界面.MQTT_Control.Control import Ui_Form
from 软件界面.MQTT_Connect.MQTT页面 import MQTT_Window


class ControlUI(QWidget):
    def __init__(self, parent=None):  # 初始化
        super(ControlUI, self).__init__(parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.sing_enabled = False  # 初始化sing是否可用的标志


        self.Up = "前进"
        self.Back = "后退"
        self.Left = "左转"
        self.Right = "右转"
        self.Stop = "停止"

        # 模式选择信号
        self.ui.comboBox_model.currentIndexChanged.connect(self.select_model)
        self.ui.SpeedSlider.valueChanged.connect(self.SpeedSpinBox_cd)
        self.ui.SpeedSpinBox.valueChanged.connect(self.SpeedSlider_cd)

    def SpeedSpinBox_cd(self, value):
        self.ui.SpeedSpinBox.setValue(value)

    def SpeedSlider_cd(self, value):
        self.ui.SpeedSlider.setValue(value)
        print(value)

    def mqtt_message_received(self, topic, message):
        print("Received MQTT message: Topic={}, Message={}".format(topic, message))
        self.update_text(message)

    def update_text(self, message):
        self.ui.textEdit.setPlainText(message)

    def select_model(self, index):
        selected_text = self.ui.comboBox_model.itemText(index)

        if selected_text == '遥控模式':
            self.Model1()
        elif selected_text == '循迹模式':
            self.Model2()
        elif selected_text == '避障模式':
            self.Model3()
        elif selected_text == 'MQTT模式':
            self.Model4()

    def Model1(self):
        print('选择了文本1')

    def Model2(self):
        print('选择了文本2')

    def Model3(self):
        print('选择了文本3')

    def Model4(self):
        self.sing()


    def sing(self):
        self.mqtt_window = MQTT_Window()  # 创建MQTT_Window对象
        self.mqtt_window.mqtt_initiated()  # 获取MQTT客户端
        self.worker = self.mqtt_window.worker  # 获取worker实例

        # 订阅消息
        self.worker.message_received.connect(self.mqtt_message_received)

        self.ui.Back_btn.clicked.connect(self.back_btn_cd)
        self.ui.Left_btn.clicked.connect(self.left_btn_cd)
        self.ui.Right_btn.clicked.connect(self.right_btn_cd)
        self.ui.Up_btn.clicked.connect(self.up_btn_cd)

        self.back_btn_press_timer = QTimer(self)
        self.left_btn_press_timer = QTimer(self)
        self.right_btn_press_timer = QTimer(self)
        self.up_btn_press_timer = QTimer(self)

        self.back_btn_press_timer.setInterval(100)  # 长按触发时间设为100毫秒
        self.left_btn_press_timer.setInterval(100)  # 长按触发时间设为100毫秒
        self.right_btn_press_timer.setInterval(100)  # 长按触发时间设为100毫秒
        self.up_btn_press_timer.setInterval(100)  # 长按触发时间设为100毫秒

        self.back_btn_press_timer.timeout.connect(self.back_btn_long_pressed)
        self.left_btn_press_timer.timeout.connect(self.left_btn_long_pressed)
        self.right_btn_press_timer.timeout.connect(self.right_btn_long_pressed)
        self.up_btn_press_timer.timeout.connect(self.up_btn_long_pressed)

        self.ui.Back_btn.installEventFilter(self)
        self.ui.Left_btn.installEventFilter(self)
        self.ui.Right_btn.installEventFilter(self)
        self.ui.Up_btn.installEventFilter(self)

    # 槽函数
    def up_btn_cd(self):
        print("向前 clicked")
        # 在这里执行点击触发的向前操作
        self.mqtt_window.mqtt_publish('Control', self.Up)

    def back_btn_cd(self):
        print("后退")
        self.mqtt_window.mqtt_publish('Control', self.Back)

    def left_btn_cd(self):
        print("左转")
        self.mqtt_window.mqtt_publish('Control',self.Left)

    def right_btn_cd(self):
        print("右转")
        self.mqtt_window.mqtt_publish('Control', self.Right)
    def Stop_btn_cd(self):
        self.mqtt_window.mqtt_publish('Control', self.Stop)

    def up_btn_long_pressed(self):
        print("向前 long pressed")
        # 在这里执行长按触发的向前操作
        self.mqtt_window.mqtt_publish('Control', self.Up)

    def back_btn_long_pressed(self):
        print("向后 long pressed")
        # 在这里执行长按触发的向后操作
        self.mqtt_window.mqtt_publish('Control', self.Back)

    def left_btn_long_pressed(self):
        print("向左 long pressed")
        # 在这里执行长按触发的向左操作
        self.mqtt_window.mqtt_publish('Control', self.Left)

    def right_btn_long_pressed(self):
        print("向右 long pressed")
        # 在这里执行长按触发的向右操作
        self.mqtt_window.mqtt_publish('Control', self.Right)

    # 这段代码是用来检测按钮的鼠标事件,并根据事件类型和按钮状态启动或停止相应的定时器
    def eventFilter(self, obj, event):
        if obj == self.ui.Back_btn:
            if event.type() == event.MouseButtonPress and event.button() == QtCore.Qt.LeftButton:
                self.back_btn_press_timer.start()
            elif event.type() == event.MouseButtonRelease and event.button() == QtCore.Qt.LeftButton:
                self.back_btn_press_timer.stop()
        elif obj == self.ui.Left_btn:
            if event.type() == event.MouseButtonPress and event.button() == QtCore.Qt.LeftButton:
                self.left_btn_press_timer.start()
            elif event.type() == event.MouseButtonRelease and event.button() == QtCore.Qt.LeftButton:
                self.left_btn_press_timer.stop()
        elif obj == self.ui.Right_btn:
            if event.type() == event.MouseButtonPress and event.button() == QtCore.Qt.LeftButton:
                self.right_btn_press_timer.start()
            elif event.type() == event.MouseButtonRelease and event.button() == QtCore.Qt.LeftButton:
                self.right_btn_press_timer.stop()
        elif obj == self.ui.Up_btn:
            if event.type() == event.MouseButtonPress and event.button() == QtCore.Qt.LeftButton:
                self.up_btn_press_timer.start()
            elif event.type() == event.MouseButtonRelease and event.button() == QtCore.Qt.LeftButton:
                self.up_btn_press_timer.stop()

        return super().eventFilter(obj, event)


# 主程序运行
if __name__ == '__main__':
    app = QApplication([])
    win = ControlUI()
    win.show()
    app.exec_()

 主界面UI

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Main_Window.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(883, 673)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMouseTracking(False)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("../../../浏览器下载中心/潜水艇.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setObjectName("groupBox")
        self.Map_webEngineView = QtWebEngineWidgets.QWebEngineView(self.groupBox)
        self.Map_webEngineView.setGeometry(QtCore.QRect(267, 27, 582, 600))
        self.Map_webEngineView.setMinimumSize(QtCore.QSize(0, 600))
        self.Map_webEngineView.setTabletTracking(False)
        self.Map_webEngineView.setStyleSheet("background-color: rgb(203, 239, 255)")
        self.Map_webEngineView.setUrl(QtCore.QUrl("about:blank"))
        self.Map_webEngineView.setObjectName("Map_webEngineView")
        self.frame = QtWidgets.QFrame(self.groupBox)
        self.frame.setGeometry(QtCore.QRect(12, 27, 217, 386))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.frame)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.pushButton_2 = QtWidgets.QPushButton(self.frame)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout_2.addWidget(self.pushButton_2, 4, 0, 1, 1)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.frame)
        self.lineEdit_2.setMaximumSize(QtCore.QSize(80, 16777215))
        self.lineEdit_2.setCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.gridLayout_2.addWidget(self.lineEdit_2, 1, 0, 1, 1)
        self.label = QtWidgets.QLabel(self.frame)
        self.label.setObjectName("label")
        self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
        self.lineEdit = QtWidgets.QLineEdit(self.frame)
        self.lineEdit.setEnabled(True)
        self.lineEdit.setMaximumSize(QtCore.QSize(80, 16777215))
        self.lineEdit.setTabletTracking(False)
        self.lineEdit.setMaxLength(1)
        self.lineEdit.setPlaceholderText("")
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout_2.addWidget(self.lineEdit, 1, 1, 1, 1)
        self.listWidget = QtWidgets.QListWidget(self.frame)
        self.listWidget.setStyleSheet("background-color: rgba(209, 209, 209, 120);")
        self.listWidget.setObjectName("listWidget")
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        self.gridLayout_2.addWidget(self.listWidget, 5, 0, 1, 2)
        self.label_2 = QtWidgets.QLabel(self.frame)
        self.label_2.setObjectName("label_2")
        self.gridLayout_2.addWidget(self.label_2, 0, 1, 1, 1)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout_2.addItem(spacerItem, 6, 0, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(self.frame)
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout_2.addWidget(self.pushButton_4, 3, 1, 1, 1)
        self.pushButton_7 = QtWidgets.QPushButton(self.frame)
        self.pushButton_7.setObjectName("pushButton_7")
        self.gridLayout_2.addWidget(self.pushButton_7, 4, 1, 1, 1)
        self.pushButton = QtWidgets.QPushButton(self.frame)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout_2.addWidget(self.pushButton, 3, 0, 1, 1)
        self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 883, 26))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        self.menu_2 = QtWidgets.QMenu(self.menubar)
        self.menu_2.setObjectName("menu_2")
        self.menu_3 = QtWidgets.QMenu(self.menubar)
        self.menu_3.setObjectName("menu_3")
        self.menu_4 = QtWidgets.QMenu(self.menubar)
        self.menu_4.setObjectName("menu_4")
        self.menu_6 = QtWidgets.QMenu(self.menu_4)
        self.menu_6.setObjectName("menu_6")
        self.menu_5 = QtWidgets.QMenu(self.menubar)
        self.menu_5.setObjectName("menu_5")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionMQTT = QtWidgets.QAction(MainWindow)
        self.actionMQTT.setCheckable(True)
        self.actionMQTT.setChecked(False)
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("../../../浏览器下载中心/spinner10.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionMQTT.setIcon(icon1)
        self.actionMQTT.setObjectName("actionMQTT")
        self.actionsjcj = QtWidgets.QAction(MainWindow)
        self.actionsjcj.setObjectName("actionsjcj")
        self.actionsjksh = QtWidgets.QAction(MainWindow)
        self.actionsjksh.setObjectName("actionsjksh")
        self.actionkongzhi = QtWidgets.QAction(MainWindow)
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("../../../桌面/无人驾驶*.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionkongzhi.setIcon(icon2)
        self.actionkongzhi.setObjectName("actionkongzhi")
        self.actionWindow = QtWidgets.QAction(MainWindow)
        self.actionWindow.setObjectName("actionWindow")
        self.actionyangp = QtWidgets.QAction(MainWindow)
        self.actionyangp.setObjectName("actionyangp")
        self.menu_2.addAction(self.actionWindow)
        self.menu_3.addAction(self.actionkongzhi)
        self.menu_6.addAction(self.actionyangp)
        self.menu_4.addAction(self.actionsjcj)
        self.menu_4.addAction(self.actionsjksh)
        self.menu_4.addAction(self.menu_6.menuAction())
        self.menu_5.addAction(self.actionMQTT)
        self.menubar.addAction(self.menu.menuAction())
        self.menubar.addAction(self.menu_2.menuAction())
        self.menubar.addAction(self.menu_3.menuAction())
        self.menubar.addAction(self.menu_4.menuAction())
        self.menubar.addAction(self.menu_5.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "探海追风"))
        self.groupBox.setTitle(_translate("MainWindow", "机器人航点规划"))
        self.pushButton_2.setText(_translate("MainWindow", "保存航点"))
        self.label.setText(_translate("MainWindow", "经度"))
        __sortingEnabled = self.listWidget.isSortingEnabled()
        self.listWidget.setSortingEnabled(False)
        item = self.listWidget.item(0)
        item.setText(_translate("MainWindow", "航点序列"))
        item = self.listWidget.item(1)
        item.setText(_translate("MainWindow", "1"))
        item = self.listWidget.item(2)
        item.setText(_translate("MainWindow", "2"))
        item = self.listWidget.item(3)
        item.setText(_translate("MainWindow", "3"))
        item = self.listWidget.item(4)
        item.setText(_translate("MainWindow", "4"))
        item = self.listWidget.item(5)
        item.setText(_translate("MainWindow", "5"))
        self.listWidget.setSortingEnabled(__sortingEnabled)
        self.label_2.setText(_translate("MainWindow", "维度"))
        self.pushButton_4.setText(_translate("MainWindow", "添加航点"))
        self.pushButton_7.setText(_translate("MainWindow", "删除航点"))
        self.pushButton.setText(_translate("MainWindow", "取消规划"))
        self.menu.setTitle(_translate("MainWindow", "文件"))
        self.menu_2.setTitle(_translate("MainWindow", "功能窗口"))
        self.menu_3.setTitle(_translate("MainWindow", "控制台"))
        self.menu_4.setTitle(_translate("MainWindow", "数据"))
        self.menu_6.setTitle(_translate("MainWindow", "试验样品"))
        self.menu_5.setTitle(_translate("MainWindow", "设置"))
        self.actionMQTT.setText(_translate("MainWindow", "MQTT"))
        self.actionsjcj.setText(_translate("MainWindow", "数据采集"))
        self.actionsjksh.setText(_translate("MainWindow", "数据可视化"))
        self.actionkongzhi.setText(_translate("MainWindow", "指挥中心"))
        self.actionWindow.setText(_translate("MainWindow", "主界面"))
        self.actionyangp.setText(_translate("MainWindow", "样品"))
from PyQt5 import QtWebEngineWidgets

 主界面控制代码

# -*- coding: utf-8 -*-
import os
import sys

from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import QMainWindow, QApplication, QSizePolicy
import folium

from 软件界面.Main_Window.Main_Window import Ui_MainWindow
from 软件界面.MQTT_Connect.MQTT页面 import MQTT_Window
from 软件界面.MQTT_Control.Control页面 import ControlUI

class My_Window(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.MAP()

        # 信号与槽
        self.ui.actionMQTT.toggled.connect(self.open_MQTT_ui)  # 绑定信号和槽函数
        self.ui.actionkongzhi.triggered.connect(self.MQTT_Control)

    #MQTT设置
    def open_MQTT_ui(self):
        self.MQTT_UI = MQTT_Window()  # 创建 ControlUI 对象
        self.MQTT_UI.show()

    #控制页面
    def MQTT_Control(self):
        self.KongZhi_UI = ControlUI()
        self.KongZhi_UI.show()

    #主界面地图设置
    def MAP(self):
        Map = folium.Map(
            location=[39.9042, 116.4074],
            control_scale=True,
            zoom_start=15,
            tiles='https://webrd02.is.autonavi.com/appmaptile?lang=zh_en&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
            attr="高德地图"
        )
        Map.add_child(folium.LatLngPopup())
        Map.add_child(folium.ClickForMarker(popup='Waypoint'))
        Map.save("save_map.html")
        # #创建内部web窗口

        self.mapshow = QWebEngineView(self.ui.Map_webEngineView)

        self.mapshow.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        # web窗口自适应
        # self.mapshow
        self.mapshow.resize(1280, 700)
        self.mapshow.setGeometry(20, 20, 2000, 1000)
        self.mapshow.updateGeometry()

        path = "file:\\" + os.getcwd() + "\\save_map.html"
        path = path.replace('\\', '/')
        self.mapshow.load(QUrl(path))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = My_Window()
    win.show()
    sys.exit(app.exec_())

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值