量子保密通信网络——所得总结分享

量子保密通信网络——所得总结分享

一、qt程序打包

1.参考网址:

http://wenku.baidu.com/link?url=90jb4iPg49As8ioyH7jFBkI2kW99fuBZxm-RZFxP6PXMEMqnO5mOpOsaQDIIGHXw1LkiWJROeCaP7xc_t06qXR1enz_UVB1Pq27AwaHf6IC

http://www.cr173.com/html/15231_1.html

2.所用工具包(下载地址见第二个网址):

  • hap-depends 查看软件的依赖库(*.dll)
  • ASPack 动态链接库压缩软件
  • filepack 软件的打包工具

3.过程描述(绝对路径 举例):

 a.在D盘新建文件夹(比如project),用于放置.exe文件及其依赖文件,
   另新建文件夹(比如server),用于放置打包文件及程序所用文件(注意在程序中写清文件打开地址);

 b.找到所要打包程序的exe文件(比如rong.exe),拷贝到project中;

 c:打开开始菜单,点击运行,输入cmd进入命令界面,然后输入命令 cd/d D:\project,接着使用windeployqt工具命令(windeployqt rong.exe),
   这时就可以在project文件夹里看到windeployqt工具自动复制的插件文件夹和dll文件、qm文件;

 d:但可能还会少些dll文件,以致在其他电脑上无法成功运行该程序,这时需要用到hap-depends来打开project中的rong.exe文件,
   打开后,可以看到很多警告,那些警告(红色方块)对应的库就是需要的动态链接库,到Qt的安装目录(我的是 C:\Qt\Qt5.7.0\Tools\QtCreator\bin)将对用的库拷贝到project的所在目录即可。

 e:接下来用ASpack对rong.exe进行压缩;

 f:最后便是程序的打包了,首先点击下一步,接着选择project文件,然后选择rong.exe文件,在设置中选择“进程结束后删除解压文件”,压缩等级滑到最右边(最好),
   点击下一步,变量名称选择TempDir,“请选择要输出的EXE文件”选择server,可命名为“服务器端”,之后点击创建等待封装完成即可。

二、在textEdit中输出中文且不覆盖

1.举例:

QString show;
QString cc = QString::number(len);
show=QStringLiteral("手机标识为 ");
show+=QString::fromLatin1(mac);
show+=QStringLiteral(" 的用户 ");
show+=QString::fromLatin1(ID);
show+=QStringLiteral(" 已成功注入 ");
show+=cc;
show+=" bit ";
show+=QStringLiteral("密钥!");
ui->textEdit->append(show);

2.说明:

a.该例子中,len,mac,ID分别为 int,char,char 型变量;

b.append为换行符,可不覆盖之前textEdit中的内容换行输出;

c.如果要输出几句含变量的句子,仅用append是不够的,因为它会将这一句换行为几句,所以这个时候需要先定义一个QString型变量(比如shu,将变量类型也转化为QString型,这时可通过“+”将变量和其他文字变为一句,通过ui->textEdit->append(show);将其全部输出;

d:如果要输出中文,可通过QStringLiteral实现,但仅凭一个QStringLiteral还是不够的,运行你会发现控制台显示“常量中有换行符”或者是输出的中文显示乱码;
解决办法是:用记事本方式打开该错误所在cpp文件,保存一下即可。但此法有一个后遗症,那就是以后你每改一次程序可能都要保存一下记事本文件,确实挺麻烦的,不过我还没找到其他办法,所以我建议中文这一步可在程序的最后一步进行,开始可先用英文代替。

e:int,char型变量如何转化为QString型见例子。

3.单行添加颜色

ui->file->setTextColor(Qt::red);
ui->file->append(QStringLiteral("文件传输成功!"));
ui->file->setTextColor(Qt::black);

如果只是加一句ui->file->setTextColor(Qt::red);,则之后每行都变为红色,不过在要变色的那一行之后紧接着加上ui->file->setTextColor(Qt::black);就可以看到只要需要的那一行变色了。

三、qt定义随机数

举例:

char* Widget::radomNumber()
{
    int i;
    char key[17] = { '\0' };
    char str[3]="01";

    QTime time;
    time= QTime::currentTime();
    qsrand(time.msec()+time.second()*1000);

    for (i = 0; i < 16; i++)//将key前五个赋予01随机数
    {
        key[i] = str[qrand()%2];
    }
    key[i]='\0';
    return key;
}

四、计时器

头文件:

 #include <QDebug>
 #include <QTime>

计时开始位置写如下函数:

 QTime time;
 time.start();

计时结束位置写如下函数:

 qDebug()<<time.elapsed()/1000.0<<"s";(以秒为单位)
 或
 qDebug()<<time.elapsed()<<"ms";(以毫秒为单位)

结果:

程序运行,将在程序下方的控制台输出程序从开始到结束位置所用的时间。

五、获取系统当前日期时间

参考网址:

http://blog.sina.com.cn/s/blog_a6fb6cc90101djki.html

获取当前时间实现代码:

QTime current_time = QTime::currentTime();
int hour = current_time.hour();     (时)
int minute = current_time.minute(); (分)
int second = current_time.second(); (秒)
int msec = current_time.msec();     (毫秒)

获取系统当前日期时间并设置显示格式

QDataTime current_data_time = QDataTime::currentDataTime();
QString current_data = current_data_time.toString("yyyy-MM-dd hh:mm::ss ddd");
例:2016-08-22 18:10:17 周一

六、类型转换

1.将char型转化为QString型:macc->play

char macc[20];
QString play = QString::fromLatin1(macc);

2.将QString型转化为char *型:str1->a

char A[1024];
char *a = A;    //对a初始空间
QString str1 ;
QByteArray ba = str1.toLatin1();//先将str1转化为QByteArray存储起来
a = ba.data();

3.将QString型转化为QByteArray型:

QString str;
QByteArray ba = str.toLatin1();

4.将int型转化为QString型:

int recvedLen;
QString cc = QString::number(recvedLen);

5.将字符串转化为数字:“1234”->1234

int Widget::ss(char *s)//将字符串转化为数字
{
    int  i, sum = 0;
    for (i = 0; i < strlen(s); i++)
    {
        sum = (s[i] - '0') + sum * 10;
    }
    return sum;
}

6.将1-9,a-f字符转化为对应的十六进制整数

char ConvertHexChar(char ch)
{
    if((ch>='0')&&(ch<='9'))
         return ch-0x30;
    //0到9: ASCII 值是 0x30...0x39,所以 ch - 0x30 就正好是正确的权
    else if((ch>='A')&&(ch<='F'))
         return ch-'A'+10;
    //A到F: 用 ch 的 ASCII 值减去 A 的 ASCII 值,就相当于 A到F 变成了 0到5,因为十六进制里 A=10...F=15,所以要加 10 才是正确的权
    else if((ch>='a')&&(ch<='f'))
         return ch-'a'+10;
    else return (-1);
}

7.将QString型转化为QByteArray 十六进制

QByteArray QString2Hex(QString str)
{
    QByteArray senddata;
    int hexdata,lowhexdata;
    int hexdatalen = 0;
    int len = str.length();
    senddata.resize(len/2); //设置长度
    char lstr,hstr;//个位和十位的数
    for(int i=0;i<len;)
    {
        hstr = str[i].toLatain1();
        if(hstr == ' ')
        {
            i++;
            continue;
        }
        i++;
        if(i>=len)
            break;
        lstr = str[i].toLatin1();
        hexdata = ConvertHexChar(hstr);
        lowhexdata = ConvertHexChar(lstr);
        if((hexdata == 16)||(lowhexdata == 16))
            break;
        else
            hexdata = hexdata*16+lowhexdata;
        i++;
        senddata[hexdatalen] = (char)hexdata;
        hexdatalen++;
    }
    senddata.resize(hexdatalen);
    return senddata;
}

8.将接收的一串QByteArray类型的16进制,转化为对应的QString型16进制

QString ShowHex(QByteArray str)
{
     QDataStream out(&str,QIODevice::ReadWrite);   //将str的数据 读到out数据流里面去
     QString buf;
     while(!out.atEnd())
     {
           qint8 outChar = 0;
           out >> outChar;   //每次一个字节的填充到 outchar
           QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0')).toUpper();   //2 字符宽度                                        //
           buf += ShowChar(str.toLatin1().data());
     }
 return buf;
}

9.将接收的一串QByteArray类型的16进制,每2个16进制转化为1个字的16进制的字符串

QString Convert4Hex(QByteArray str)
{
     QDataStream out(&str,QIODevice::ReadWrite);   //将str的数据 读到out里面去
     QString buf;
     while(!out.atEnd())
     {
           qint16 outChar = 0;
           out>>outChar;   //每次一个字节的填充到 outchar
           QString str = QString("%1").arg(outChar&0xFFFF,4,16,QLatin1Char('0')).toUpper() + QString(" ");   //2 字符宽度
           buf += str;
     }
     return buf;
}

10.将十六进制转换成十进制的字符串

char ShowChar(char *a)
{
     int b,c;
     if(a[0]>=65&&a[0]<=70)
     {
       b= a[0]-64;
     }
     else
     {
         b= a[0]-'0';
     }
     if(a[1]>=65&&a[1]<=70)
     {
       c= a[1]-64+9;
     }
     else
     {
         c= a[1]-'0';
     }
     return (char) b*16+c;
}

七、数据库

1.涉及到的头文件

#include <QtSql/QSql>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlRecord>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>  

2.如果出现”qt_sql_default_connection”的错误,可通过以下代码解决问题:

QSqlDatabase db;

if(QSqlDatabase::contains("qt_sql_default_connection"))
    db = QSqlDatabase::database("qt_sql_default_connection");
else
    db = QSqlDatabase::addDatabase("QSQLITE");

db.setDatabaseName("D:/Server/database/User.db");

//User为数据库的名字,注意要加上.db,否则可能会产生一个空白User文件,无法访问要用到的数据库。

3.从数据库中提取数据并在ui界面tableView中显示:

头文件:

#include <QSqlTableModel>
#include <QTableView

代码:

//首先要打开数据库,代码如上
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");
model->setHeaderData(5,Qt::Horizontal,"consume");

ui->show->setModel(model);//show为控件tableview名
db.close();

4.根据mac选择插入或更新数据库:

数据库中表格的表头有:ID start end mac lasttime consume

QSqlQuery my;
bool ff=true;//用来判断插入还是更新
int sta=ss(start);//start为char型
int en=ss(end);
my.exec("select * from User");
while(my.next())
{
    QString macc=my.value(3).toString();
    if(strcmp(macc.toLatin1().data(),mac)==0)
    {
        my.prepare("update User set ID=:id,start=:start,end=:end,lasttime=:time,consume=:con where mac = :mac");
        my.bindValue(":mac",mac);
        my.bindValue(":id",ID);//更新数据
        my.bindValue(":start",sta);
        my.bindValue(":end",en);
        my.bindValue(":time",time);
        my.bindValue(":con",0);
        if(!my.exec())
        {
        qDebug()<<my.lastError();
        }
        else
        {
        qDebug()<<"updated!";
        //用到头文件#include<QDebug>
        QMessageBox::information(this,"Information","updated",QMessageBox::Ok);
        //用到头文件#include <QMessageBox>
        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);
    my.addBindValue(0);
    if(!my.exec())
    {
      qDebug()<<my.lastError();
    }
    else
    {
      qDebug()<<"insert succeed!";
      QMessageBox::information(this,"Information","insert succeed",QMessageBox::Ok);
    }
}

八、监听端口

用到头文件:

#include <QTcpServer>

实现代码:

QTcpServer *tcpServer;
tcpServer = new QTcpServer(this);
if(!tcpServer->listen(QHostAddress::AnyIPv4,9000))
{   //监听本地主机的9000端口,如果出错就输出错误信息,并关闭
    qDebug() << tcpServer->errorString();
    qDebug()<<" liseten error!";
    QMessageBox::warning(this,"Information","listen error!",QMessageBox::Yes);
    close();
}
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(recvMessage()));//接收到连接信号便跳转到recvMessaage函数

九、阻塞

头文件:

#include <qtcpsocket.h>

代码:

 QTcpSocket  *clientConnection =tcpServer->nextPendingConnection() ;
if( clientConnection->waitForReadyRead() == true) //注意::读取要设成阻塞状态 因为客户端的也是阻塞写
    clientConnection->read(recvbuf,100);

阻塞写:clientsocket->write(recvbuf,100);

十、文件操作

1.读取文件内容

char key[33] = {'\0'};
FILE *fp;
fp = fopen(fileName1,"r");
if(fp!=NULL)
{
    fgets(key,33,fp);//从文件中读取33个密钥
}
fclose(fp);

2.从一个文件中指定位置读取写入文件

#include <QFile>
#include <QMessageBox>
QFile file("user.txt");
file.open(QFile::WriteOnly|QFile::Text);

FILE *QFile = fopen("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();

十一、定时器

QTimer *timer;
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(autodata()));
timer->start(500);
//在这500ms内,程序仍会往下进行,到达500ms后自动进入autodata()函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值