lhc.pro:
#-------------------------------------------------
#
# Project created by QtCreator 2016-07-31T13:55:54
#
#-------------------------------------------------
QT += core gui
QT += sql//数据库连接
QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
//#Qt5运行Qt4的源码。要在pro中加入QT += core gui和greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = lhc
TEMPLATE = app
SOURCES += main.cpp\
widget.cpp
HEADERS += widget.h
FORMS += widget.uiwidget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QSqlTableModel>
#include <QWidget>
#include <QTcpServer>
#include <qtcpsocket.h>
#include <stdio.h> //用于printf等函数的调用
#include <winsock2.h>
#include <QApplication>
#include <iostream>
#include <QtSql/QSql>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlRecord>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
#include <QDebug>
#include <QMessageBox>
//Socket的函数调用
#pragma comment (lib, "ws2_32") //C语言引用其他类
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
int ss(char *s);
void Regest();
void Item(int begin,int ends,char di[20]);
~Widget();
private slots:
void on_search_clicked();
void recvMessage();
private:
Ui::Widget *ui;
char ID[20] ;
char end[20];
char start[20];
char mac[20] ;
char time[20] ;
QTcpServer *tcpServer;
SOCKET s;
};
#endif // WIDGET_Hmain.cpp:
#include "widget.h"
#include <QApplication>
#include <QSqlTableModel>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
Widget w;
w.show();
return a.exec();
}widget.cpp:
#include "widget.h"
#include "ui_widget.h"
#include<QSqlQueryModel>
#include<QTableView>
#include<QFile>
#include<QIODevice>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)//初始化一个Widget界面指针,其变量名为ui。
{
tcpServer = new QTcpServer(this);
if(!tcpServer->listen(QHostAddress::AnyIPv4,9000))
{ //监听本地主机的9000端口,如果出错就输出错误信息,并关闭
qDebug() << tcpServer->errorString();
qDebug()<<" liseten error!";
QMessageBox::warning(NULL,"Information","listen error!",QMessageBox::Yes);
close();
}
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(recvMessage()));
ui->setupUi(this);
}
void Widget::recvMessage()
{
char recvbuf[100];
QTcpSocket *clientConnection =tcpServer->nextPendingConnection() ;
if( clientConnection->waitForReadyRead() == true) //注意::读取要设成阻塞状态 因为客户端的也是阻塞写
clientConnection->read(recvbuf,100);
strcpy(ID, recvbuf);
strcpy(start, recvbuf + 20);
strcpy(end, recvbuf + 40);
strcpy(mac, recvbuf + 60);
strcpy(time, recvbuf + 80);
QMessageBox::information(this,"tip","Received succeed!",QMessageBox::Ok);
ui->receive->setText(recvbuf);
Regest();
}
void Widget::Regest()
{
QSqlDatabase db;
// if(QSqlDatabase::contains("qt_sql_default_connection"))
// db = QSqlDatabase::database("qt_sql_default_connection");
// else
// db = QSqlDatabase::addDatabase("QSQLITE");
db=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("User.db");
if(!db.open())
{
qDebug()<<db.lastError();
QMessageBox::warning(NULL,"Login fail","open Database fail",QMessageBox::Yes);
}else
{
QSqlQuery my;
bool ff=true;
int sta=ss(start);
int en=ss(end);
my.exec("select * from User");
while(my.next())
{
QString id=my.value(0).toString();
if(strcmp(id.toLatin1().data(),ID)==0)
{
my.prepare("update User set start = :start,end=:end,mac=:mac,lasttime=:time where ID = :id");
my.bindValue(":id",ID);//更新数据
my.bindValue(":start",sta);
my.bindValue(":end",en);
my.bindValue(":mac",mac);
my.bindValue(":time",time);
if(!my.exec())
{
qDebug()<<my.lastError();
}
else
{
qDebug()<<"updated!";
QMessageBox::information(this,"Information","updated",QMessageBox::Ok);
ff=false;
}
}
}
if(ff)//如果false为true,表明无重名,没有要更新数据,将插入数据
{
my.prepare("insert into User values (?, ?, ?, ?, ?)");
my.addBindValue(ID);
my.addBindValue(sta);
my.addBindValue(en);
my.addBindValue(mac);
my.addBindValue(time);
if(!my.exec())
{
qDebug()<<my.lastError();
}
else
{
qDebug()<<"insert succeed!";
QMessageBox::information(this,"Information","insert succeed",QMessageBox::Ok);
}
}
char text[20];
int i = 0, j = 0;
while (i < strlen(mac))
{
if (mac[i] != ':')
{
text[j++] = mac[i];
}
i++;
}
text[j] = '\0';
Item(sta,en,text);//提取密钥并放入mac文件夹
}
db.close();
}
void Widget::Item(int begin, int ends, char di[20])
{
int len=ends-begin;
char key[2048]={"\0"};
QString fn = QString::fromLatin1(di); //先转换成Qstring类型
fn += ".txt";
QFile file("D:/users/"+fn);
file.open(QFile::WriteOnly|QFile::Text); //open()可以创建文件
file.close();
file.open(QFile::WriteOnly|QFile::Text);
FILE *QFile = fopen("Quantuam//Qkey.txt","r");//打开密钥文件
if(QFile == NULL)
{
QMessageBox::warning(NULL,"Warring","Open File fail",QMessageBox::Yes);
}
if( fseek(QFile,begin,0)==0)//参数:第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置
{
fread(key,1,len,QFile);//每次获取需要的量子密钥
}
fclose(QFile);
file.write(key,strlen(key)); //写入文件
file.close(); //最后要close
}
void Widget::on_search_clicked()
{
QSqlDatabase db;
if(QSqlDatabase::contains("qt_sql_default_connection"))
db = QSqlDatabase::database("qt_sql_default_connection");
else
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("User.db");
db.open();
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("select * from User");
model->setHeaderData(0,Qt::Horizontal,"ID");
model->setHeaderData(1,Qt::Horizontal,"start");
model->setHeaderData(2,Qt::Horizontal,"end");
model->setHeaderData(3,Qt::Horizontal,"mac");
model->setHeaderData(4,Qt::Horizontal,"lasttime");
ui->show->setModel(model);
db.close();
}
Widget::~Widget()
{
delete ui;
}
int Widget::ss(char *s)//将字符串转化为数字
{
int i, sum = 0;
for (i = 0; i < strlen(s); i++)
{
sum = (s[i] - '0') + sum * 10;
}
return sum;
}