From b1b69d307f5a602ea6875007dbd64d0c2ae719e9 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 21 Nov 2023 20:28:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=BA=9B=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 73 ++++++++++ base/base.cpp | 37 +++++ base/base.h | 79 +++++++++++ base/crc.cpp | 192 +++++++++++++++++++++++++ base/crc.h | 37 +++++ base/file.h | 240 +++++++++++++++++++++++++++++++ base/mycfg.cpp | 304 ++++++++++++++++++++++++++++++++++++++++ base/mycfg.h | 59 ++++++++ checker_host.pro | 48 +++++++ checker_host_zh_CN.ts | 3 + interface/codec.cpp | 0 interface/codec.h | 34 +++++ interface/codec_ym.cpp | 136 ++++++++++++++++++ interface/if_tcp.cpp | 11 ++ interface/if_tcp.h | 17 +++ interface/interface.cpp | 32 +++++ interface/interface.h | 25 ++++ main.cpp | 58 ++++++++ mainwindow.cpp | 13 ++ mainwindow.h | 24 ++++ mainwindow.ui | 31 ++++ 21 files changed, 1453 insertions(+) create mode 100644 .gitignore create mode 100644 base/base.cpp create mode 100644 base/base.h create mode 100644 base/crc.cpp create mode 100644 base/crc.h create mode 100644 base/file.h create mode 100644 base/mycfg.cpp create mode 100644 base/mycfg.h create mode 100644 checker_host.pro create mode 100644 checker_host_zh_CN.ts create mode 100644 interface/codec.cpp create mode 100644 interface/codec.h create mode 100644 interface/codec_ym.cpp create mode 100644 interface/if_tcp.cpp create mode 100644 interface/if_tcp.h create mode 100644 interface/interface.cpp create mode 100644 interface/interface.h create mode 100644 main.cpp create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 mainwindow.ui diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fab7372 --- /dev/null +++ b/.gitignore @@ -0,0 +1,73 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + diff --git a/base/base.cpp b/base/base.cpp new file mode 100644 index 0000000..78f02bc --- /dev/null +++ b/base/base.cpp @@ -0,0 +1,37 @@ + + +#include "base/base.h" +#include "QList" + + + + + +// 字符串转化为数字列表 +template +QList str_to_nums(mystring str,char c){ + QStringList snums = str.split(c); + QList nums; + for(int i=0;isize(); + if(index<0) index=size+index; + if(index>=size) return char(0); + return QByteArray::operator [](index); + } + myarray &operator =(const myarray &b){ + QByteArray::operator =(b); + return *this; + } +// myarray &operator =(const myarray b){ +// QByteArray::operator =(b); +// return *this; +// } + myarray &operator =(const QByteArray &b){ + QByteArray::operator =(b); + return *this; + } +// myarray &operator =(const QByteArray b){ +// QByteArray::operator =(b); +// return *this; +// } + +}; + + + +class mystring:public QString +{ +public: + mystring(){} + mystring(const char *data):QString(data){} + mystring(myarray &data):QString(data.data()){} + mystring(QByteArray &data):QString(data.data()){} + mystring(QByteArray data):QString(data.data()){} + mystring(QString &data):QString(data){} + mystring(QString data):QString(data){} + virtual ~mystring(){} + const char *data(){ + localdata=QString::toLocal8Bit(); + return localdata.data(); + } + mystring &operator =(const QString &b){ + QString::operator =(b); + return *this; + } +protected: + myarray localdata; +}; + + +template +QList str_to_nums(mystring str,char c); + +myarray str_to_data(mystring str,char c); + + + +#endif // BASE_H diff --git a/base/crc.cpp b/base/crc.cpp new file mode 100644 index 0000000..f9daceb --- /dev/null +++ b/base/crc.cpp @@ -0,0 +1,192 @@ +#include "crc.h" +#include +#include "QString" + + +crc::crc() +{ + +} + +uint8_t crc::crc8(uint8_t *Ptr,uint8_t num) +{ + + uint8_t crc = 0; + uint16_t j,i; + + for (j = 0; j < num; j++) + { + crc ^= *(Ptr+j); + for ( i = 0; i < 8; i++) + { + if ((crc & 0x01) != 0) + { + crc >>= 1; + crc ^= 0x8c; + } + else + { + crc >>= 1; + } + } + } + return crc; + +} + + + + + void crc::crc16(uint8_t *data, int offset, int len,uint8_t *lb,uint8_t *hb) +{ + if (len > 0) + { + uint16_t crc = 0xFFFF; + int i = offset; + for (; i < len; i++) + { + crc = (uint16_t)(crc ^ (data[i])); + for (int j = 0; j < 8; j++) + { + crc = (crc & 1) != 0 ? (uint16_t)((crc >> 1) ^ 0xA001) : (uint16_t)(crc >> 1); + } + } + uint8_t hi = (uint8_t)((crc & 0xFF00) >> 8); //高位置 + uint8_t lo = (uint8_t)(crc & 0x00FF); //低位置 + *lb=lo;*hb=hi; + } +} + + +int8_t crc::CheckSumCode(uint8_t CODEMODE, uint8_t *pBuffer, uint16_t Len, uint16_t offset, uint8_t *CHKA, uint8_t *CHKB) +{ + uint16_t i = 0; + uint8_t _CHKA = 0x00,_CHKB = 0x00; + + + for(i=offset;i +#include "stdint-gcc.h" +#include "QString" +#include "QByteArray" + +#define DECODE 0 +#define ENCODE 1 + +typedef union{ + int32_t l_data; + uint32_t ul_data; + uint8_t uc_databuf[4]; + char c_databuf[4]; + uint16_t us_databuf[2]; + int16_t s_databuf[2]; +} ConverBuf; + +class crc +{ +public: + crc(); + static int8_t CheckSumCode(uint8_t CODEMODE, uint8_t *pBuffer, uint16_t Len, uint16_t offset, uint8_t *CHKA, uint8_t *CHKB); + static int CheckSumCode(uint8_t CODEMODE, QByteArray pBuffer, uint16_t Len, uint16_t offset, uint8_t *CHKA, uint8_t *CHKB); + + static QString byte_array_to_string(QByteArray data); + static QString byte_array_to_int_string(QByteArray data); + static QString uint8_array_to_string(uint8_t * buf,int len); + + static uint8_t crc8(uint8_t *Ptr,uint8_t num); + static void crc16(uint8_t *data, int offset, int len,uint8_t *lb,uint8_t *hb); + static uint32_t crc32(const QByteArray &data_buf); + +}; + +#endif // CRC_H diff --git a/base/file.h b/base/file.h new file mode 100644 index 0000000..5ae4694 --- /dev/null +++ b/base/file.h @@ -0,0 +1,240 @@ + + + +#ifndef file_h__ +#define file_h__ + + + +#include +#include "QByteArray" +#include "stdint-gcc.h" +#include "QList" +#include "base.h" +#include +#include +#include "base/crc.h" +#include "QDateTime" +#include "base/mycfg.h" + + +/* Type for a 16-bit quantity. */ +typedef uint16_t Elf32_Half; +typedef uint32_t Elf32_Word; +/* Type of addresses. */ +typedef uint32_t Elf32_Addr; + +/* Type of file offsets. */ +typedef uint32_t Elf32_Off; + +#define EI_NIDENT (16) + +typedef struct +{ + unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ + Elf32_Half e_type; /* Object file type */ + Elf32_Half e_machine; /* Architecture */ + Elf32_Word e_version; /* Object file version */ + Elf32_Addr e_entry; /* Entry point virtual address */ + Elf32_Off e_phoff; /* Program header table file offset */ + Elf32_Off e_shoff; /* Section header table file offset */ + Elf32_Word e_flags; /* Processor-specific flags */ + Elf32_Half e_ehsize; /* ELF header size in bytes */ + Elf32_Half e_phentsize; /* Program header table entry size */ + Elf32_Half e_phnum; /* Program header table entry count */ + Elf32_Half e_shentsize; /* Section header table entry size */ + Elf32_Half e_shnum; /* Section header table entry count */ + Elf32_Half e_shstrndx; /* Section header string table index */ +} Elf32_Ehdr; + + + + +class app_file:public QObject +{ + Q_OBJECT +public: + app_file(QString name){ + QFile file; + file.setFileName(name); + if(file.exists()) + { + file.open(QIODevice::ReadOnly); + data = file.readAll(); + file.close(); + } + } + ~app_file(){} + void set_file_point() + { + Elf32_Ehdr h; + memcpy((void *)&h,data.data(),sizeof(h)); + addr= h.e_shoff+h.e_shnum*h.e_shentsize; + //qDebug()<<"ext file addr="<=data.size()) + { + //qDebug()<<"addr="<cfg_=cfg_; + + bool new_file=true; + file_ = new QFile(COMM_FILE_PATH+find_file()); + qInfo()<<"save comm_log at "<fileName()<exists()) + { + new_file=false; + } + + if (!file_->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)){ + return; + } + if(new_file==true){ + QTextStream tWrite(file_); +// QStringList ret_infos=cfg_->get_return_info(); + QStringList ret_infos; + qDebug()<<"ret_info:"<flush(); + file_->close(); + delete file_; + file_=nullptr; + } + } + QString find_file(){ + // 找到检测日志文件,超过7天则删除 + QDir dir=QDir(COMM_FILE_PATH); + QStringList list; + list.append("*.csv"); + QStringList files=dir.entryList(list,QDir::NoFilter,QDir::NoSort); + qDebug()<<"files="<0){ + // 删除超时的记录 + foreach (QString name, files) { + if(dateout(name)==true){ + QFile fi; + fi.setFileName(COMM_FILE_PATH+name); + qDebug()<<"will remove "<get_plan_id())+".csv"; + return t.toString("yyyy_MM_dd")+"-"+QString::number(0)+".csv"; + } + // 是否超时,true超时 + bool dateout(QString file){ + QStringList name=file.split("."); + qDebug()<<"name="<30)||(!t.isValid())){ + return true; + } + return false; + } + void save(uint8_t src,QByteArray data) + { + if(file_){ + QTextStream tWrite(file_); + QString str=QString("%1,").arg(src); + str.append(QString("%1,").arg(crc::byte_array_to_string(data.mid(0,8)))); + str.append(QString("%1\n").arg(crc::byte_array_to_int_string(data.mid(16,data.size()-16)))); + QDateTime t=QDateTime::currentDateTime(); + tWrite< +#include +#include +#include +#include +#include "QDebug" +#include "base/file.h" +#include +#include + + + +// 配置路径 +#define CFG_PATH QString("/home/root/config/") +//#define CFG_PATH qApp->applicationDirPath()+"/config/" + +// 配置文件 +#define CFG_FILE_NAME CFG_PATH+"cfg.json" +#define CHECK_CFG_FILE_NAME cfg_->def_check_cfg + +// 自启动路径 +#define AUTO_START_PATH "/usr/local/QDesktop-fb" + +// 方案配置文件关键字段,用于生成默认方案文件名 +#define CHECK_CFG_FILE_KEY "checker_ye_cfg" +// mcu程序关键字段,用于生成默认程序文件名 +#define MCU_APP_FILE_KEY "JQChecker" +// shell脚本关键字段,用于运行shell脚本 +#define SHELL_FILE_KEY "checker_app_pre" +// 程序信息 +#define APP_INFO_FILE "info.json" +// 判断脚本 +#define APP_JUDGE_FILE "judge.lua" + +// 软件版本 +#define SOFT_VERSION "unknown" +#define HARD_VERSION "unknown" + + + + + + + + +QList jarray_to_intlist(QJsonValue j){ + QJsonArray arr; + if(j.isArray()){ + arr= j.toArray(); + } + QList intl; + for(int i=0;i jarray_to_strlist(QJsonValue j){ + QJsonArray arr; + if(j.isArray()){ + arr= j.toArray(); + } + QList strl; + for(int i=0;i intl) +{ + QJsonArray a; + for(int i=0;i privates; +}; + + + + + + +mycfg::mycfg() +{ +} + +void mycfg::to_class(mystring str) +{ + QJsonParseError err; + QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(),&err); + QJsonObject j; + if(err.error != QJsonParseError::NoError) + { + qWarning()<<"parse json failed:"<applicationFilePath()); + QByteArray d; + d=app.get_file(APP_INFO_FILE); + QJsonParseError err; + QJsonDocument doc = QJsonDocument::fromJson(d,&err); + if(err.error != QJsonParseError::NoError) + { + qWarning()<<"parse json failed:"< list_files=app.get_file_list(); + for(int i=0;iapplicationFilePath()); + if(file_dst.exists()) + { + if(file_dst.open(QIODevice::ReadOnly)&&file_src.open(QIODevice::ReadOnly)) + { + QByteArray c1=file_src.readAll(); + QByteArray c2=file_dst.readAll(); + QByteArray md5_1=QCryptographicHash::hash(c1, QCryptographicHash::Md5); + QByteArray md5_2=QCryptographicHash::hash(c2, QCryptographicHash::Md5); + if(md5_1!=md5_2) + { + if(file_dst.remove()!=true) + qWarning()<<"remove file "< lua_libs;// lua库 + mystring def_lua_judge;// lua判断异常脚本 + bool use_lua_judge;// 是否使用lua脚本 + mystring config_path;// 配置文件夹 + mystring device_type;// 设备类型 + int moter_count;// 电机步数 + int uart_bsp;// 串口波特率 + int auto_test;// 自动测试 + int coder_return_mode;// 赋码仪返回模式0精简,1完整 + int slave_addr_start;// 赋码仪起始地址0,1 + QList production_info;// 生产信息 + mystring def_jwt_app;// 默认jwt程序 + int slave_scheme_ext;// 小板使用方案扩展 + +}; + + + +mycfg *syscfg(); + + +#endif // MYCFG_H diff --git a/checker_host.pro b/checker_host.pro new file mode 100644 index 0000000..4136917 --- /dev/null +++ b/checker_host.pro @@ -0,0 +1,48 @@ +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++11 + +# The following define makes your compiler emit warnings if you use +# any Qt feature that has been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + base/base.cpp \ + base/crc.cpp \ + base/mycfg.cpp \ + interface/codec.cpp \ + interface/codec_ym.cpp \ + interface/if_tcp.cpp \ + interface/interface.cpp \ + main.cpp \ + mainwindow.cpp + +HEADERS += \ + base/base.h \ + base/crc.h \ + base/file.h \ + base/mycfg.h \ + interface/codec.h \ + interface/if_tcp.h \ + interface/interface.h \ + mainwindow.h + +FORMS += \ + mainwindow.ui + +TRANSLATIONS += \ + checker_host_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 diff --git a/checker_host_zh_CN.ts b/checker_host_zh_CN.ts new file mode 100644 index 0000000..21c4480 --- /dev/null +++ b/checker_host_zh_CN.ts @@ -0,0 +1,3 @@ + + + diff --git a/interface/codec.cpp b/interface/codec.cpp new file mode 100644 index 0000000..e69de29 diff --git a/interface/codec.h b/interface/codec.h new file mode 100644 index 0000000..cb2f129 --- /dev/null +++ b/interface/codec.h @@ -0,0 +1,34 @@ +#ifndef CODEC_H +#define CODEC_H + +#include "QObject" +#include "base/base.h" + +class Codec : public QObject +{ + Q_OBJECT +public: + Codec() + { + fullFrame = false; + } + virtual ~Codec() {} + virtual myarray encode(int srcAddr, int dstAddr, int cmd, myarray data) = 0; + virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd, myarray data) = 0; + virtual myarray decode(int &srcAddr, int &dstAddr, int &cmd) + { + if (fullFrame == true) + { + fullFrame = false; + return decode(srcAddr, dstAddr, cmd, data); + } + return myarray(); + } + virtual bool recvByte(int byte) = 0; + +protected: + bool fullFrame; + myarray data; +}; + +#endif // CODEC_H diff --git a/interface/codec_ym.cpp b/interface/codec_ym.cpp new file mode 100644 index 0000000..8863259 --- /dev/null +++ b/interface/codec_ym.cpp @@ -0,0 +1,136 @@ + +#include "codec.h" + +class CodecYm : public Codec +{ + Q_OBJECT +public: + CodecYm() : Codec() + { + is_big_data = false; + num_to_read = 0; + } + ~CodecYm() {} + // 重载接收字节函数 + bool recvByte(int byte) + { + bool ack = false; + if (fullFrame == true) + { + return fullFrame; + } + data.append(uint8_t(byte)); + switch (data.size()) + { + case 2: + if (uint8_t(data[0]) == 0x59u && uint8_t(data[1]) == 0x6du) + { + is_big_data = false; + num_to_read = 4; // 帧头+2byte负载长度 + } + else + { + data.remove(0, 1); + num_to_read = 0; + } + break; + case 4: + { + int len = data[2] | (data[3] << 8); + if (len < 65535) + { + is_big_data = false; + num_to_read += len + 2; // 负载+2byte校验 + qDebug("normal data. len=%d", len); + } + else + { + is_big_data = true; + num_to_read = 11; // 扩展数据长度 + qDebug("big data."); + } + } + break; + case 11: + { + if (is_big_data == true) + { + int len = data[7] | (data[8] << 8) | (data[9] << 16) | (data[10] << 24); + num_to_read = 4 + len + 2; // 负载+2byte校验 + qDebug("big data. len=%d", len); + } + } + default: + break; + } + // 此时一帧数据已完成 + if (num_to_read > 0 && num_to_read == data.size()) + { + ack = true; + num_to_read = 0; + } + + fullFrame = ack; + return fullFrame; + } + // 重载解码函数 + QByteArray decode(int &srcAddr, int &dstAddr, int &cmd, QByteArray data) + { + Q_UNUSED(srcAddr); + Q_UNUSED(dstAddr); + QByteArray r; + if (data.size() < 9) + { + // 主机一帧数据至少9字节 + qWarning("recv data len too less"); + return r; + } + + if ((uint8_t(data[0]) != 0x59u) || (uint8_t(data[1]) != 0x6du)) + { + // 帧头不对 + qWarning("frame head not 0x59 0x6d"); + return r; + } + + int len = (data[2] | (data[3] << 8)); + if (len == 65535) + { + // 重新设置数据长度 + len = data[7] | (data[8] << 8) | (data[9] << 16) | (data[10] << 24); + is_big_data = true; + } + else + { + is_big_data = false; + } + if (len + 6 != data.size()) + { + // 如果长度不相等则产生了数据丢失 + qWarning("recv data have lossed"); + return r; + } + uint8_t chk_a = 0, chk_b = 0; + // crc::crc16((uint8_t *)data.data(),2,len+4,&chk_a,&chk_b); + if (chk_a != uint8_t(data[data.size() - 2]) || chk_b != uint8_t(data[data.size() - 1])) + { + // crc校验不对 + qWarning("recv data check error:%02x,%02x %02x,%02x", chk_a, chk_b, int(data[data.size() - 2]), + int(data[data.size() - 1])); + } + // 保存此流水号 + cmd_no = data[5] | (data[6] << 8); + cmd = data[4]; + // 数据负载 + if (is_big_data == false) + r = data.mid(7, len - 3); + else + r = data.mid(11, len - 7); + return r; + } + +private: + bool is_big_data; + int num_to_read; + int cmd_no; +}; diff --git a/interface/if_tcp.cpp b/interface/if_tcp.cpp new file mode 100644 index 0000000..b3671e3 --- /dev/null +++ b/interface/if_tcp.cpp @@ -0,0 +1,11 @@ +#include "if_tcp.h" + +if_tcp::if_tcp() +{ + +} + +if_tcp::~if_tcp() +{ + +} diff --git a/interface/if_tcp.h b/interface/if_tcp.h new file mode 100644 index 0000000..4248e39 --- /dev/null +++ b/interface/if_tcp.h @@ -0,0 +1,17 @@ +#ifndef IF_TCP_H +#define IF_TCP_H + +#include +#include + +class if_tcp : public InterFace +{ + Q_OBJECT +public: + if_tcp(); + virtual ~if_tcp(); + +protected: +}; + +#endif // IF_TCP_H diff --git a/interface/interface.cpp b/interface/interface.cpp new file mode 100644 index 0000000..782d132 --- /dev/null +++ b/interface/interface.cpp @@ -0,0 +1,32 @@ + +#include "interface.h" +#include "string.h" +#include "QDebug" + +typedef struct +{ + InterFace *interface; + const char *name; +} self_table_def; + +static self_table_def g_self_table[] = + { + {.interface = 0, .name = "default"}, +}; + +InterFace *interFaceFind(const char *name) +{ + int num = sizeof(g_self_table) / sizeof(g_self_table[0]); + self_table_def *item = 0; + for (int i = 0; i < num; i++) + { + item = &g_self_table[i]; + if (item != nullptr) + { + if (strcmp(name, item->name) == 0) + return item->interface; + } + } + qWarning("can not find interface named '%s'", name); + return nullptr; +} diff --git a/interface/interface.h b/interface/interface.h new file mode 100644 index 0000000..e447dec --- /dev/null +++ b/interface/interface.h @@ -0,0 +1,25 @@ +#ifndef INTERFACE_H +#define INTERFACE_H + +#include +#include "base/base.h" + +using namespace std; +using namespace std::placeholders; + +typedef std::function irq_cb; + +class InterFace : public QObject +{ + Q_OBJECT +public: + InterFace() {} + virtual ~InterFace() {} + virtual void init() = 0; + virtual int write(myarray data) = 0; + virtual void set_irq(irq_cb fun, myarray &data) = 0; +}; + +InterFace *interFaceFind(const char *name); + +#endif // INTERFACE_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..0bcaa31 --- /dev/null +++ b/main.cpp @@ -0,0 +1,58 @@ +#include "mainwindow.h" + +#include +#include +#include +#include +#include "base/base.h" +#include "base/mycfg.h" + +#define log(fmt, ...) \ + { \ + QString str = QString::asprintf(fmt, ##__VA_ARGS__); \ + printf("%s", str.toLocal8Bit().data()); \ + } + +using namespace std; +using namespace std::placeholders; + +typedef std::function Fun; + +class B +{ +public: + void call(int a, Fun f) + { + f(a, 2); + } +}; + +class Test +{ +public: + void callback(int a, int b) + { + // qDebug()<local_ip); + + return app.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..fd3f23b --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,13 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent), ui(new Ui::MainWindow) +{ + ui->setupUi(this); +} + +MainWindow::~MainWindow() +{ + delete ui; +} diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..9083f15 --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,24 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui +{ + class MainWindow; +} +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private: + Ui::MainWindow *ui; +}; +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..b07f62d --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,31 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + 0 + 0 + 800 + 25 + + + + + + + +