#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "huffmantree.h"
#include "Other.h"
#include "bitmap.h"
#include <QFile>
#include <QDebug>
#include <QByteArray>
#include <QPainter>
#include <QList>
#include "time.h"
#include <QTime>
#include <ctime>
#include <QUdpSocket>
#include <QHostInfo>
#include <QNetworkInterface>
#include <QScrollBar>
#include <QDateTime>
#include <QProcess>
#include <QMessageBox>
#include <sstream>
#include <string>
#include <QThread>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),flag(false)
{
ui->setupUi(this);
ui->deCodeButton->setEnabled(false);
ui->enCodeButton->setEnabled(false);
ui->onTableButton->setEnabled(false);
ui->sendButton->setEnabled(false);
this->connect(ui->sendEdit,SIGNAL(textChanged()),this,SLOT(buttonSlot()));
udpSocket = new QUdpSocket(this);
port = 45455;
udpSocket->bind(port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);//此处的bind是个重载函数,连接本机的port端口,采用ShareAddress模式(即允许其它的服务连接到相同的地址和端口,特别是
//用在多客户端监听同一个服务器端口等时特别有效),和ReuseAddressHint模式(重新连接服务器)
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));
sendMessage(NewParticipant);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_enCodeButton_clicked()
{ n=0;
ui->enCodeButton->setEnabled(false);
ui->deCodeButton->setEnabled(true);
ui->onTableButton->setEnabled(true);
text=ui->sendEdit->toPlainText();
if(!text.isEmpty())
{
freq=statistics(text);
for(int i=0;i<96;i++)
{
if(freq[i]!=0)
n++;
cout<<freq[i]<<' ';
}
HuffmanTree tree(freq,n);
Tree= new HuffmanTree(tree);
tree.pre_order(tree.root);
stringstream stream;
str.clear();
tree.print(tree.root,stream);//将Huffman编码树转换为编码表
stream>>str;
cout<<str;
Bitmap* code = new Bitmap;
table.clear();
generateCT(code,0,table, tree.root);
//ui->tableWidget->verticalHeader()->hide()
ui->tableWidget->setRowCount(0);
ui->reciveEdit->clear();
//printf("\nEncoding:");
codeString = new Bitmap; //二进制编码串
char* ch;
QByteArray ba = text.toLatin1();
ch=ba.data();
n = encode(table,codeString,ch); //将根据编码表生成(长度为n)
ui->reciveEdit->setText(codeString->bits2string(n));
decode(&tree, codeString, n);
}
else
{
QMessageBox::warning(0,"Warning","Message can not be empty!",QMessageBox::Ok);
return;
}
ui->sendButton->setEnabled(true);
}
void MainWindow::on_deCodeButton_clicked()
{
if(!ui->sendEdit->toPlainText().isEmpty())
{
this->Code=decode(Tree, codeString, n); //利用Huffman编码树,对长度为n的二进制编码串解码
ui->reciveEdit->setText(Code);
ui->deCodeButton->setEnabled(false);
}
else
{
ui->reciveEdit->clear();
ui->tableWidget->setRowCount(0);
HuffmanTree tree;
tree.createTree(tree.root,str);
tree.print(tree.root,cout);
string substr=coding.toStdString();
cout<<substr;
this->Code=decodeString(&tree,substr); //利用Huffman编码树,对长度为n的二进制编码串解码
ui->reciveEdit->setText(Code);
ui->deCodeButton->setEnabled(false);
}
}
void MainWindow::on_onTableButton_clicked()
{
for (int i = 0; i < 96; i++) //输出编码表
if(table[char(i+0x20)])
{
QString dataI(char(i+0x20));
QString codeI(table[char(i+0x20)]);
QString numberI;
numberI.setNum(freq[i]);
QTableWidgetItem *tdata = new QTableWidgetItem(dataI);
QTableWidgetItem *tnumber = new QTableWidgetItem(numberI);
QTableWidgetItem *tcode = new QTableWidgetItem(codeI);
ui->tableWidget->insertRow(ui->tableWidget->rowCount());//先设置的是第0行,即新来的用户放在最上面
ui->tableWidget->setItem(ui->tableWidget->rowCount()-1,0,tdata);//第0行的第1列...
ui->tableWidget->setItem(ui->tableWidget->rowCount()-1,1,tnumber);
ui->tableWidget->setItem(ui->tableWidget->rowCount()-1,2,tcode);
}
flag=true;
ui->onTableButton->setEnabled(false);
update();
}
void MainWindow::buttonSlot()
{
ui->enCodeButton->setEnabled(true);
ui->deCodeButton->setEnabled(false);
ui->onTableButton->setEnabled(false);
}
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPoint id;
if(flag==false)
{
;
}else
{
//painter.scale(2,2); //放大两倍
QList<HuffmanNode*> list;
HuffmanNode* subTree=Tree->root;
if(subTree!=NULL)
list.push_back(subTree);
while(!list.isEmpty())
{
subTree=list.front();
list.pop_front();
if(subTree->leftChild!=NULL&&subTree->rightChild!=NULL)
{
painter.drawEllipse(subTree->id,2,2);
//QThread::sleep(2);
subTree->leftChild->id.setY(subTree->id.y()+20);
subTree->rightChild->id.setY(subTree->id.y()+20);
painter.drawLine(subTree->id,subTree->leftChild->id);
painter.drawLine(subTree->id,subTree->rightChild->id);
painter.drawEllipse(subTree->leftChild->id,2,2);
painter.drawEllipse(subTree->rightChild->id,2,2);
id=(subTree->id+subTree->leftChild->id)/2;;
id.setX(id.x()-5);
id.setY(id.y()+5);
painter.drawText(id,"0");
id=(subTree->id+subTree->rightChild->id)/2;
id.setX(id.x()-5);
id.setY(id.y()+5);
painter.drawText(id,"1");
}
else
{
id=subTree->id;
id.setY(id.y()+10);
painter.drawText(id,QChar(subTree->Getdata()));
}
if(subTree->leftChild!=NULL)
list.push_back(subTree->leftChild);
if(subTree->rightChild!=NULL)
list.push_back(subTree->rightChild);
}
flag=false;
}
}
void MainWindow::sendMessage(MessageType type ,QString serverAddress)
{
QByteArray data;
QDataStream out(&data,QIODevice::WriteOnly);
QString localHostName = QHostInfo::localHostName();
QString address = getIP();
out<<type<<getUserName()<<localHostName;
switch(type)
{
case Message :
if (ui->reciveEdit->toPlainText() == "") {
QMessageBox::warning(0,"Warning","Message can not be empty!",QMessageBox::Ok);
return;
}
out << address << getMessage()<<QString::fromStdString(str);//将ip地址和得到的消息内容输入out数据流
ui->messageBrowser->verticalScrollBar()->setValue(ui->messageBrowser->verticalScrollBar()->maximum());
break;
case NewParticipant :
out << address;
break;
case ParticipantLeft :
break;
}
udpSocket->writeDatagram(data,data.length(),QHostAddress::Broadcast, port);
}
void MainWindow::processPendingDatagrams()
{
while(udpSocket->hasPendingDatagrams())//Returns true if at least one datagram is waiting to be read; otherwise returns false.
{
QByteArray datagram;
//pendingDatagramSize为返回第一个在等待读取报文的size,resize函数是把datagram的size归一化到参数size的大小一样
datagram.resize(udpSocket->pendingDatagramSize());
//将读取到的不大于datagram.size()大小数据输入到datagram.data()中,datagram.data()返回的是一个字节数组中存储
//数据位置的指针
udpSocket->readDatagram(datagram.data(), datagram.size());
QDataStream in(&datagram, QIODevic
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
huffman编码压缩解压缩网络传输画哈夫曼树数据库登入系统.zip (22个子文件)
huffmannode.cpp 331B
huffmantree.h 877B
Other.h 3KB
huffman.db 3KB
register.cpp 2KB
huffmantree.cpp 4KB
register.ui 5KB
images.qrc 321B
dynamic.gif 97KB
Huffman.pro 683B
huffmannode.h 1KB
main.cpp 944B
mainwindow.ui 6KB
connection.h 4KB
mainwindow.cpp 15KB
mainwindow.h 1KB
login.h 714B
login.cpp 2KB
login.ui 7KB
bitmap.h 2KB
widget.cpp 8KB
register.h 736B
共 22 条
- 1
资源评论
Mike_Xu_
- 粉丝: 7
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功