diff --git a/bottom-1.png b/bottom-1.png new file mode 100644 index 0000000..ac9461e Binary files /dev/null and b/bottom-1.png differ diff --git a/bottom.png b/bottom.png new file mode 100644 index 0000000..f14f321 Binary files /dev/null and b/bottom.png differ diff --git a/font.qrc b/font.qrc new file mode 100644 index 0000000..09349a9 --- /dev/null +++ b/font.qrc @@ -0,0 +1,5 @@ + + + 逍遥行书.ttf + + diff --git a/handle.cpp b/handle.cpp new file mode 100644 index 0000000..b1eb5b1 --- /dev/null +++ b/handle.cpp @@ -0,0 +1,113 @@ +#include "handle.h" + +Handle::Handle(QWidget *parent) + : QWidget(parent) +{ + setAutoFillBackground(true); + setPalette(QPalette(Qt::transparent)); + resize(200,200); + setMinimumSize(100,100); + mouseX=width()/2; + mouseY=height()/2; + tim=new QTimer(this); + connect(tim,&QTimer::timeout,this,[=]{ + emit keyNumchanged(getKeyNum()); + }); + connect(this,&Handle::keyNumchanged,this,[=](int num){ + qDebug()<pos().x(); + mouseY=event->pos().y(); + if(r==true){ + update(); + r=false; + } + else{ + r=true; + } +} +void Handle::mouseReleaseEvent(QMouseEvent* event){ + mouseX=width()/2; + mouseY=height()/2; + tim->stop(); + mousePressed=false; + emit keyNumchanged(Handle::stop); + update(); +} +void Handle::mousePressEvent(QMouseEvent* event){ + mouseX=event->pos().x(); + mouseY=event->pos().y(); + tim->start(100); + mousePressed=true; + update(); +} + +double Handle::Pointdis(int a,int b,int x,int y){ + return sqrt((double)((x-a)*(x-a)+(y-b)*(y-b))); +} +int Handle::getKeyNum(){ + int x,y; + int keynum; + x=(int)(handleX*3.0/(padR*2)); + y=(int)(handleY*3.0/(padR*2)); + keynum=3*y+x; + return keynum; +} + diff --git a/handle.h b/handle.h new file mode 100644 index 0000000..9707987 --- /dev/null +++ b/handle.h @@ -0,0 +1,46 @@ +#ifndef HANDLE_H +#define HANDLE_H + +#include +#include +#include +#include +#include +#include +#include +class Handle : public QWidget +{ + Q_OBJECT + +public: + Handle(QWidget *parent = 0); + ~Handle(); + enum {upleft=0,up,upright,left,stop,right,downleft,down,downright}; +signals: + void keyNumchanged(int num); +protected: + void paintEvent(QPaintEvent *event)override; + void mouseMoveEvent(QMouseEvent *event)override; + void mouseReleaseEvent(QMouseEvent *event)override; + void mousePressEvent(QMouseEvent *event)override; + // void resizeEvent(QResizeEvent *event)override; +private: + int mouseX; + int mouseY; + int handleX;//摇杆 + int handleY; + int handleR; + int padX;//底盘 + int padY; + int padR; + double handPadDis;//两圆圆心距离 + bool mousePressed; + QTimer *tim; +private: + double Pointdis(int a,int b,int x,int y);//两点距离 + int getKeyNum(); + +}; + +#endif // HANDLE_H + diff --git a/icon(Mac).iconset/icon_128x128.png b/icon(Mac).iconset/icon_128x128.png new file mode 100644 index 0000000..4f32281 Binary files /dev/null and b/icon(Mac).iconset/icon_128x128.png differ diff --git a/icon(Mac).iconset/icon_128x128@2x.png b/icon(Mac).iconset/icon_128x128@2x.png new file mode 100644 index 0000000..ce2db88 Binary files /dev/null and b/icon(Mac).iconset/icon_128x128@2x.png differ diff --git a/icon(Mac).iconset/icon_16x16.png b/icon(Mac).iconset/icon_16x16.png new file mode 100644 index 0000000..71a3ac9 Binary files /dev/null and b/icon(Mac).iconset/icon_16x16.png differ diff --git a/icon(Mac).iconset/icon_16x16@2x.png b/icon(Mac).iconset/icon_16x16@2x.png new file mode 100644 index 0000000..e5742d7 Binary files /dev/null and b/icon(Mac).iconset/icon_16x16@2x.png differ diff --git a/icon(Mac).iconset/icon_256x256.png b/icon(Mac).iconset/icon_256x256.png new file mode 100644 index 0000000..ce2db88 Binary files /dev/null and b/icon(Mac).iconset/icon_256x256.png differ diff --git a/icon(Mac).iconset/icon_256x256@2x.png b/icon(Mac).iconset/icon_256x256@2x.png new file mode 100644 index 0000000..0ec6024 Binary files /dev/null and b/icon(Mac).iconset/icon_256x256@2x.png differ diff --git a/icon(Mac).iconset/icon_32x32.png b/icon(Mac).iconset/icon_32x32.png new file mode 100644 index 0000000..e5742d7 Binary files /dev/null and b/icon(Mac).iconset/icon_32x32.png differ diff --git a/icon(Mac).iconset/icon_32x32@2x.png b/icon(Mac).iconset/icon_32x32@2x.png new file mode 100644 index 0000000..d8b8d64 Binary files /dev/null and b/icon(Mac).iconset/icon_32x32@2x.png differ diff --git a/icon(Mac).iconset/icon_512x512.png b/icon(Mac).iconset/icon_512x512.png new file mode 100644 index 0000000..0ec6024 Binary files /dev/null and b/icon(Mac).iconset/icon_512x512.png differ diff --git a/icon(Mac).iconset/icon_512x512@2x.png b/icon(Mac).iconset/icon_512x512@2x.png new file mode 100644 index 0000000..df22c33 Binary files /dev/null and b/icon(Mac).iconset/icon_512x512@2x.png differ diff --git a/icon(iOS).iconset/icon_100x100.png b/icon(iOS).iconset/icon_100x100.png new file mode 100644 index 0000000..50ae775 Binary files /dev/null and b/icon(iOS).iconset/icon_100x100.png differ diff --git a/icon(iOS).iconset/icon_114x114.png b/icon(iOS).iconset/icon_114x114.png new file mode 100644 index 0000000..cd247cd Binary files /dev/null and b/icon(iOS).iconset/icon_114x114.png differ diff --git a/icon(iOS).iconset/icon_120x120.png b/icon(iOS).iconset/icon_120x120.png new file mode 100644 index 0000000..e232bf1 Binary files /dev/null and b/icon(iOS).iconset/icon_120x120.png differ diff --git a/icon(iOS).iconset/icon_144x144.png b/icon(iOS).iconset/icon_144x144.png new file mode 100644 index 0000000..28aee7f Binary files /dev/null and b/icon(iOS).iconset/icon_144x144.png differ diff --git a/icon(iOS).iconset/icon_153x153.png b/icon(iOS).iconset/icon_153x153.png new file mode 100644 index 0000000..d40148c Binary files /dev/null and b/icon(iOS).iconset/icon_153x153.png differ diff --git a/icon(iOS).iconset/icon_160x160.png b/icon(iOS).iconset/icon_160x160.png new file mode 100644 index 0000000..5ccdcc2 Binary files /dev/null and b/icon(iOS).iconset/icon_160x160.png differ diff --git a/icon(iOS).iconset/icon_172x172.png b/icon(iOS).iconset/icon_172x172.png new file mode 100644 index 0000000..c847198 Binary files /dev/null and b/icon(iOS).iconset/icon_172x172.png differ diff --git a/icon(iOS).iconset/icon_180x180.png b/icon(iOS).iconset/icon_180x180.png new file mode 100644 index 0000000..cc14706 Binary files /dev/null and b/icon(iOS).iconset/icon_180x180.png differ diff --git a/icon(iOS).iconset/icon_196x196.png b/icon(iOS).iconset/icon_196x196.png new file mode 100644 index 0000000..ea6f925 Binary files /dev/null and b/icon(iOS).iconset/icon_196x196.png differ diff --git a/icon(iOS).iconset/icon_29x29.png b/icon(iOS).iconset/icon_29x29.png new file mode 100644 index 0000000..f9eae4c Binary files /dev/null and b/icon(iOS).iconset/icon_29x29.png differ diff --git a/icon(iOS).iconset/icon_40x40.png b/icon(iOS).iconset/icon_40x40.png new file mode 100644 index 0000000..c3a7960 Binary files /dev/null and b/icon(iOS).iconset/icon_40x40.png differ diff --git a/icon(iOS).iconset/icon_48x48.png b/icon(iOS).iconset/icon_48x48.png new file mode 100644 index 0000000..a3fc842 Binary files /dev/null and b/icon(iOS).iconset/icon_48x48.png differ diff --git a/icon(iOS).iconset/icon_50x50.png b/icon(iOS).iconset/icon_50x50.png new file mode 100644 index 0000000..385ec4b Binary files /dev/null and b/icon(iOS).iconset/icon_50x50.png differ diff --git a/icon(iOS).iconset/icon_55x55.png b/icon(iOS).iconset/icon_55x55.png new file mode 100644 index 0000000..b59dd87 Binary files /dev/null and b/icon(iOS).iconset/icon_55x55.png differ diff --git a/icon(iOS).iconset/icon_57x57.png b/icon(iOS).iconset/icon_57x57.png new file mode 100644 index 0000000..3a9986f Binary files /dev/null and b/icon(iOS).iconset/icon_57x57.png differ diff --git a/icon(iOS).iconset/icon_58x58.png b/icon(iOS).iconset/icon_58x58.png new file mode 100644 index 0000000..ac2a1d8 Binary files /dev/null and b/icon(iOS).iconset/icon_58x58.png differ diff --git a/icon(iOS).iconset/icon_72x72.png b/icon(iOS).iconset/icon_72x72.png new file mode 100644 index 0000000..1cb3f32 Binary files /dev/null and b/icon(iOS).iconset/icon_72x72.png differ diff --git a/icon(iOS).iconset/icon_76x76.png b/icon(iOS).iconset/icon_76x76.png new file mode 100644 index 0000000..ebcc3a8 Binary files /dev/null and b/icon(iOS).iconset/icon_76x76.png differ diff --git a/icon(iOS).iconset/icon_80x80.png b/icon(iOS).iconset/icon_80x80.png new file mode 100644 index 0000000..7c98394 Binary files /dev/null and b/icon(iOS).iconset/icon_80x80.png differ diff --git a/icon(iOS).iconset/icon_87x87.png b/icon(iOS).iconset/icon_87x87.png new file mode 100644 index 0000000..b40b53d Binary files /dev/null and b/icon(iOS).iconset/icon_87x87.png differ diff --git a/icon.icns b/icon.icns new file mode 100644 index 0000000..a8b2bbb Binary files /dev/null and b/icon.icns differ diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..46cb739 Binary files /dev/null and b/icon.png differ diff --git a/image.qrc b/image.qrc new file mode 100644 index 0000000..9feccf2 --- /dev/null +++ b/image.qrc @@ -0,0 +1,10 @@ + + + pad.png + bottom.png + logo.png + wallpaper.JPG + icon.icns + bottom-1.png + + diff --git a/launch.png b/launch.png new file mode 100644 index 0000000..f9b1e3f Binary files /dev/null and b/launch.png differ diff --git a/launchicon.png b/launchicon.png new file mode 100644 index 0000000..9661f38 Binary files /dev/null and b/launchicon.png differ diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..6f5d7fa Binary files /dev/null and b/logo.png differ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..6e56b9d --- /dev/null +++ b/main.cpp @@ -0,0 +1,12 @@ +#include "mainwindow.h" + +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true); + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..21bff9e --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,201 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include "handle.h" +#include + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + QFontDatabase::addApplicationFont(":/font/逍遥行书.ttf"); + client = new QMQTT::Client(QHostAddress::LocalHost, 1883); + connect(client, &QMQTT::Client::disconnected, this, &MainWindow::disconnected_handler); + connect(client, &QMQTT::Client::received, this, &MainWindow::received_handler); + connect(client, &QMQTT::Client::pingresp, this, &MainWindow::pingresp_handler); + connect(client, &QMQTT::Client::connected, this, &MainWindow::connected_handler); + connect(client, &QMQTT::Client::subscribed, this, &MainWindow::subscribed_handler); + right_r = new QTimer(this); + left_r = new QTimer(this); + connect(right_r,&QTimer::timeout,this,[=]{ + if (key != '9') + { + QMQTT::Message message; + QByteArray payload; + message.setQos(1); + payload.append('9'); + message.setPayload(payload); + message.setTopic("/Car"); + client->publish(message); + key = '9'; + } + }); + connect(left_r,&QTimer::timeout,this,[=]{ + if (key != 'A') + { + QMQTT::Message message; + QByteArray payload; + message.setQos(1); + payload.append('A'); + message.setPayload(payload); + message.setTopic("/Car"); + client->publish(message); + key = 'A'; + } + }); + ui->setupUi(this); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + + +void MainWindow::on_connectButton_clicked() +{ + client->setHostName(ui->addressEdit->text()); + client->setPort(ui->portEdit->text().toInt()); + client->setClientId("ios"); + client->setUsername("iPhone"); + client->setPassword("iPhone"); + client->connectToHost(); +} + +void MainWindow::connected_handler() +{ + const QString content = QDateTime::currentDateTime().toString() + +"\n" + +"MQTT服务器已连接上\n"; + ui->log->insertPlainText(content); + client->subscribe(ui->ctrlTopicEdit->text(),1); + ui->addressEdit->setEnabled(false); + ui->portEdit->setEnabled(false); + ui->ctrlTopicEdit->setEnabled(false); + ui->connectButton->setEnabled(false); + ui->disconnectButton->setEnabled(true); + ui->rocker->setEnabled(true); + ui->left_r->setEnabled(true); + ui->right_r->setEnabled(true); + client->setAutoReconnect(true); + connect(ui->rocker,&Handle::keyNumchanged,ui->rocker,[=](int num){ + if (num != key) + { + QMQTT::Message message; + QByteArray payload; + message.setQos(1); + payload.append(num+'0'); + message.setPayload(payload); + message.setTopic("/Car"); + client->publish(message); + key = num; + } + }); +} + +void MainWindow::disconnected_handler() +{ + const QString content = QDateTime::currentDateTime().toString() + +"\n" + +"MQTT服务器已断开\n"; + ui->log->insertPlainText(content); + ui->addressEdit->setEnabled(true); + ui->portEdit->setEnabled(true); + ui->ctrlTopicEdit->setEnabled(true); + ui->connectButton->setEnabled(true); + ui->disconnectButton->setEnabled(false); + ui->rocker->setEnabled(false); + ui->left_r->setEnabled(false); + ui->right_r->setEnabled(false); + disconnect(ui->rocker); +} + +void MainWindow::received_handler(const QMQTT::Message& message) +{ + const QString content = QDateTime::currentDateTime().toString() + +"\n" + +"Topic: "+message.topic()+ QLatin1Char('\n') + +"Message: "+message.payload()+ QLatin1Char('\n') + +"Qos: "+QLatin1Char(message.qos()+'0')+'\n'; + ui->log->insertPlainText(content); +} + +void MainWindow::pingresp_handler() +{ + const QString content = QDateTime::currentDateTime().toString() + + QLatin1Char('\n') + + QLatin1String("MQTT Pong!") + + QLatin1Char('\n'); + ui->log->insertPlainText(content); +} + +void MainWindow::subscribed_handler(const QString& topic, const quint8 qos) +{ + const QString content = QDateTime::currentDateTime().toString() + +"\n" + +"Topic: "+topic+ QLatin1Char('\n') + +"Qos: "+QLatin1Char(qos+'0')+QLatin1Char('\n')+ + "已订阅\n"; + ui->log->insertPlainText(content); +} + +void MainWindow::error_handler(const QMQTT::ClientError error) +{ + const QString content = QDateTime::currentDateTime().toString() + +"\n" + +"Error: "+ error; + ui->log->insertPlainText(content); +} + +void MainWindow::on_disconnectButton_clicked() +{ + client->disconnectFromHost(); + client->setAutoReconnect(false); +} + +void MainWindow::on_log_textChanged() +{ + ui->log->moveCursor(QTextCursor::End); +} + + +void MainWindow::on_right_r_pressed() +{ + right_r->start(100); +} + +void MainWindow::on_right_r_released() +{ + right_r->stop(); + if ('4' != key) + { + QMQTT::Message message; + QByteArray payload; + message.setQos(1); + payload.append('4'); + message.setPayload(payload); + message.setTopic("/Car"); + client->publish(message); + key = '4'; + } +} + +void MainWindow::on_left_r_pressed() +{ + left_r->start(100); +} + +void MainWindow::on_left_r_released() +{ + left_r->stop(); + if ('4' != key) + { + QMQTT::Message message; + QByteArray payload; + message.setQos(1); + payload.append('4'); + message.setPayload(payload); + message.setTopic("/Car"); + client->publish(message); + key = '4'; + } +} diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..a616213 --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,48 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include "qmqtt.h" + +QT_BEGIN_NAMESPACE +namespace Ui { class MainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private slots: + void on_connectButton_clicked(); + void connected_handler(); + void disconnected_handler(); + void received_handler(const QMQTT::Message& message); + void pingresp_handler(); + void subscribed_handler(const QString& topic, const quint8 qos); + void error_handler(const QMQTT::ClientError error); + + void on_disconnectButton_clicked(); + + void on_log_textChanged(); + + + + void on_right_r_pressed(); + + void on_right_r_released(); + + void on_left_r_pressed(); + + void on_left_r_released(); + +private: + Ui::MainWindow *ui; + QMQTT::Client *client; + QTimer *left_r,*right_r; + uint8_t key = -1; +}; +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..e2c18f2 --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,507 @@ + + + MainWindow + + + + 0 + 0 + 485 + 795 + + + + + 0 + 0 + + + + 物联网小车控制器 + + + true + + + true + + + QTabWidget::Triangular + + + true + + + true + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 字魂49号-逍遥行书 + 44 + 75 + true + + + + Qt::LeftToRight + + + 物联网小车控制器 + + + Qt::AlignCenter + + + true + + + + + + + true + + + + 0 + 0 + + + + + 2000 + 2000 + + + + + 1 + + + + + + + :/image/bottom-1.png + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + + + + QTabWidget::North + + + QTabWidget::Triangular + + + 0 + + + false + + + false + + + false + + + + 控制器 + + + + + + false + + + 顺时针转🔃 + + + + + + + Qt::Vertical + + + + 1 + 1 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + false + + + + + + + false + + + 逆时针转🔄 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + MQTT服务器 + + + + + + 服务器地址: + + + + + + + false + + + 断开 + + + + + + + 服务器端口: + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 控制Topic: + + + + + + + 11883 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + mqtt.ourdocs.cn + + + + + + + /Car + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 连接 + + + + + + + + 日志 + + + + 20 + + + 12 + + + 20 + + + 20 + + + + + + + + + 关于 + + + + + + + Comic Sans MS + 19 + false + + + + ©2021 +Made By Mentalflow. + + + Qt::AlignCenter + + + + + + + + 字魂49号-逍遥行书 + 27 + + + + 为电子设计综合实验设计 + + + Qt::AlignCenter + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + :/image/logo.png + + + false + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 关于 + + + + + + Handle + QWidget +
handle.h
+ 1 +
+
+ + + + +
diff --git a/pad.png b/pad.png new file mode 100644 index 0000000..52a59b8 Binary files /dev/null and b/pad.png differ diff --git a/test.pro b/test.pro new file mode 100644 index 0000000..8dd09f4 --- /dev/null +++ b/test.pro @@ -0,0 +1,34 @@ +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets qmqtt + +CONFIG += c++11 +ICON = icon.icns +TARGET = IoTCar +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + handle.cpp \ + main.cpp \ + mainwindow.cpp + +HEADERS += \ + handle.h \ + mainwindow.h + +FORMS += \ + mainwindow.ui + +TRANSLATIONS += \ + test_zh_CN.ts + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +RESOURCES += \ + font.qrc \ + image.qrc diff --git a/test_zh_CN.ts b/test_zh_CN.ts new file mode 100644 index 0000000..630fd35 --- /dev/null +++ b/test_zh_CN.ts @@ -0,0 +1,3 @@ + + + diff --git a/wallpaper.JPG b/wallpaper.JPG new file mode 100644 index 0000000..b0a8e5a Binary files /dev/null and b/wallpaper.JPG differ diff --git a/逍遥行书.ttf b/逍遥行书.ttf new file mode 100644 index 0000000..23f3dd8 Binary files /dev/null and b/逍遥行书.ttf differ