#include "mainwidget.h"
#include "ui_mainwidget.h"
MainWidget::MainWidget(QString username,QWidget *parent) :
QWidget(parent),
ui(new Ui::MainWidget)
{
ui->setupUi(this);
this->setWindowIcon(QIcon(":/icon.png"));
this->setWindowTitle(QString("TCP聊天室:%1").arg(username));
ui->name_list->setEditTriggers(QAbstractItemView::NoEditTriggers); //不允许编辑
ui->name_list->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
ui->name_list->verticalScrollBar()->setStyleSheet("QScrollBar{width:16px;}");
ui->textEdit->setReadOnly(true);
ui->send_btn->setFocus();
ui->send_btn->setDefault(true);
ui->msg_edit->installEventFilter(this);//设置完后自动调用其eventFilter函数
this->username = username;
}
MainWidget::~MainWidget()
{
delete ui;
}
void MainWidget::on_send_text_clicked()
{
QString homePath = QDir::homePath();
QString filePath = QFileDialog::getOpenFileName(this, tr("Open a file"), homePath, tr("All files (*.*)"), NULL, QFileDialog::DontResolveSymlinks);
QString filename = filePath.section("/", -1);
if (filename.isEmpty())
return;
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, "发送文件", tr("Do you want to send \"%1\"?").arg(filename));
if (reply == QMessageBox::No)
return;
else
{
QString text = ui->msg_edit->text();
if(text.isEmpty()) //群发
{
QString currentTime = QTime::currentTime().toString("H:mm A");
ui->textEdit->append("" + username + " [" + currentTime + "] send a file \"" + filename + "\"");
this->sendFile(filePath,filename);
}
else //私发文件
{
ui->msg_edit->clear();
int n = text.indexOf(' ');
QString name = text.mid(1,n-1);
if(name == username)
{
QMessageBox::critical(this,"错误","不能自己给自己发送文件!");
}
else
{
QString currentTime = QTime::currentTime().toString("H:mm A");
ui->textEdit->append(QString("" + username + " [" + currentTime + "] send a private file to %1\""
+ filename + "\"").arg(name));
this->sendFile(filePath,filename,name);
}
}
}
}
void MainWidget::on_save_btn_clicked()
{
QFile file("./memory.txt");
if (file.exists()) //文件存在
{
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, "提示", tr("是否覆盖之前的聊天记录?"));
if (reply == QMessageBox::No)
{
if (file.open(QIODevice::WriteOnly | QIODevice::Append))
{
QTextStream stream(&file);
//转换为字符串
QString str = ui->textEdit->toPlainText();
str = "\n\n" + str;
//写入文本流
stream << str;
//关闭文件
file.close();
}
}
else
{
if (file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream stream(&file);
//转换为字符串
QString str = ui->textEdit->toPlainText();
//写入文本流
stream << str;
//关闭文件
file.close();
}
}
}
else
{
QMessageBox::warning(this, "提示", tr("聊天记录文件不存在,已为您自动创建文件!"));
file.open(QIODevice::WriteOnly | QIODevice::Append);
}
}
void MainWidget::on_send_btn_clicked()
{
QString text;
text = ui->msg_edit->text();
if(text.isEmpty())
{
QMessageBox::warning(this, "发送失败", "输入不能为空!");
return;
}
ui->msg_edit->clear();
if(text[0] == '@')
{
int n = text.indexOf(' ');
QString to_user = text.mid(1,n-1);
QString insert = "tell you quietly:";
QString data_text = insert + text.mid(n,-1);
QString text_self = QString("私发给%1:%2").arg(to_user).arg(text.mid(n));
qDebug() << text_self;
if(to_user == username)
{
QMessageBox::critical(this,"错误","不能自己给自己发送消息!");
}
else
{
QString currentTime = QTime::currentTime().toString("H:m A");
ui->textEdit->append("" + username + " [" + currentTime + "] " + text_self + "");
emit send_to_user(username,to_user,data_text);
}
}
else
{
QString currentTime = QTime::currentTime().toString("H:m A");
ui->textEdit->append("" + username + " [" + currentTime + "] : " + text + "");
emit send_text(username,text);
}
}
void MainWidget::on_name_list_itemDoubleClicked(QListWidgetItem *item)
{
QString client_name = ui->name_list->currentItem()->text();
QString a = "@";
a = a + client_name + " ";
ui->msg_edit->clear();
ui->msg_edit->setText(a);
}
void MainWidget::on_exit_btn_clicked()
{
QMessageBox::StandardButton response;
response = QMessageBox::question(this, "退出", tr("是否退出软件?"));
if(response == QMessageBox::Yes)
{
emit exit_client();
emit update_namelist(username);
this->close();
}
else
{
return;
}
}
void MainWidget::on_stop_clicked()
{
QMessageBox::StandardButton response;
response = QMessageBox::question(this, "注销", tr("是否退出软件并注销账户?"));
if(response == QMessageBox::Yes)
{
qDebug() << "点击注销账户按钮";
emit exit_client();
emit account_cancellation(username);
this->close();
}
else
{
return;
}
}
void MainWidget::update_text(QString sendname,QString data)
{
QString currentTime = QTime::currentTime().toString("H:m A");
ui->textEdit->append(sendname + " [" + currentTime + "] : " + data);
}
void MainWidget::update_file(QString sendname,QString filename,QString file_data)
{
QMessageBox::StandardButton response;
QString content = QString("你收到了一个来自%1的群发文件%2,是否接收?").arg(sendname).arg(filename);
response = QMessageBox::question(this,"提示",content);
if(response == QMessageBox::Yes)
{
readFile(filename,file_data.toUtf8());
QString currentTime = QTime::currentTime().toString("H:m A");
ui->textEdit->append(QString(username + " [" + currentTime + "] : "
+ "收到了一个来自%1的群发文件%2").arg(sendname).arg(filename));
}
else
{
QMessageBox::information(this,"接收文件","未接收该文件!");
}
}
void MainWidget::update_file_private(QString sendname,QString filename,QString file_data)
{
QMessageBox::StandardButton response;
QString content = QString("你收到了%1私发给你的文件%2,是否接收?").arg(sendname).arg(filename);
response = QMessageBox::question(this,"提示",content);
if(response == QMessageBox::Yes)
{
readFile(filename,file_data.toUtf8());
QString currentTime = QTime::currentTime().toString("H:m A");
ui->textEdit->append(QString(username + " [" + currentTime + "] :"
+ "收到了一个来自%1的私发文件%2").arg(sendname).arg(filename));
}
else
{
QMessageBox::information(this,"消息","未接收该文件!");
}
}
void MainWidget::update_users(int count,QListonline_users)
{
ui->name_list->clear();
QList::iterator it = online_users.begin();
for(; it!=online_users.end(); ++it)
{
ui->name_list->addItem(*it);
}
}
void MainWidget::sendFile(QString filePath,QString filename,QString name)
{
//发送的数据存入block中
QByteArray block;
QFile file(filePath);
//打开文件,定义错误提醒
if(!file.open(QIODevice::ReadOnly)){
QMessageBox::warning(this,"错误","无法打开文件!");
return;
}
//打开文件流,以写的方式打开
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_8);
//将数据读取到QByteArray
QByteArray dataOfFile = file.readAll();
//关闭文件
file.close();
//放入block
block.append(dataOfFile);
if(name.isEmpty()) //群发文件
{
emit send_file_to_all(username,filename,block);
}
else //私发文件
{
emit send_file_private(username,filename,block,name);
}
QProgressDialog *progressDlg = new QProgressDialog(this);
progressDlg->setWindowModality(Qt::WindowModal);
progressDlg->setMinimumDuration(0);
progressDlg->setAttribute(Qt::WA_DeleteOnClose, true);
progressDlg->setWindowTitle(tr("上传文件"));
progressDlg->setLabelText(tr("正在上传......"));
progressDlg->setCancelButtonText(tr("取消"));
progressDlg->setRange(0, 12000);
for (int i = 1; i < 12000; i++)
{
progressDlg->setValue(i);
if (progressDlg->wasCanceled())
{
break;
}
}
progressDlg->close();
QMessageBox::information(this,"发送文件","发送成功!");
}
void MainWidget::readFile(QString filename,QByteArray data)
{
QString homePath = QDir::homePath();
QString filePath = QFileDialog::getExistingDirectory(this,
tr("Open Directory"),
homePath,
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
QFile outFile(filePath + "/" +filename);
if(!outFile.open(QIODevice::WriteOnly)){
QMessageBox::warning(this,"","错误: 无法打开文件.");
return;
}
outFile.write(data);
outFile.close();
QMessageBox::question(this,"接收文件","接收成功!");
}
bool MainWidget::eventFilter(QObject *target, QEvent *event)
{
if(target == ui->msg_edit) //可替换
{
if(event->type() == QEvent::KeyPress)//回车键
{
QKeyEvent *k = static_cast(event);
if(k->key() == Qt::Key_Return || k->key() == Qt::Key_Enter)
{
on_send_btn_clicked(); //替换为需要响应的函数事件,以这里的按钮为例
return true;
}
}
}
return QWidget::eventFilter(target,event);
}