QT聊天系统类似QQ聊天(基于TCP、UDP)
想要更多项目私wo!!!
一、项目简介
此项目参考QQ的登陆界面和聊天界面,主要的组成有三个界面,分别是登录界面、私聊界面和群聊界面。
二、项目截图
登入界面
登陆中界面
私聊界面
群聊界面
表情界面
三、部分代码
login.c
/*想要更多项目私wo!!!*/
#include "login.h"
#include "ui_login.h"
#include <QNetworkRequest>
#include <QByteArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <QNetworkReply>
#include <QJsonArray>
#include <QMessageBox>
#include <QSettings>
#include "./showWidget/showwidget.h"
#include "./Sunshine/sunshine.h"
//外部变量 需要定义在函数外,否则程序会将其认定为局部变量,同时会将调用的那个文件中的 user_account 认为未定义的变量,出现连接错误
QString user_account = "";
void sleep(unsigned int msec)
{
QTime dieTime = QTime::currentTime().addMSecs(msec);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
Login::Login(QWidget *parent) :
QWidget(parent),
ui(new Ui::Login)
{
ui->setupUi(this);
i=0;
setWindowFlags(Qt::FramelessWindowHint|Qt::Tool);
QMovie *movie = new QMovie(":/new/prefix1/blue70-2.gif");
ui->label->setMovie(movie);
ui->label_2->installEventFilter(this);
ui->label_3->installEventFilter(this);
movie->start();
ui->label_4->setStyleSheet("border-radius:15px;background-color:green;border-image:url(':/new/prefix1/12.jpg')");
ui->label_5->setOpenExternalLinks(true);
ui->label_5->installEventFilter(this);
animation=new QPropertyAnimation(ui->label_4, "geometry");
animation->setDuration(400);
animation->setStartValue(QRect(30, 170, 85, 85));
animation->setEndValue(QRect(150, 170, 85, 85));
}
Login::~Login()
{
delete ui;
}
/****************************
* Function: mousePressEvent(QMouseEvent *event)
*
* Description:
* 鼠标按下事件
*
****************************/
void Login::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
this->setMouseTracking(true);
mouse_press = true;
//鼠标相对于窗体的位置(或者使用event->globalPos() - this->pos())
move_point = event->pos();
qDebug()<<"移动1";
qDebug()<<event->source();
}
}
/****************************
* Function: mouseReleaseEvent(QMouseEvent *event)
*
* Description:
* 设置鼠标为未被按下
*
****************************/
void Login::mouseReleaseEvent(QMouseEvent *event)
{
//设置鼠标为未被按下
mouse_press = false;
}
/****************************
* Function: mouseMoveEvent(QMouseEvent *event)
*
* Description:
* 鼠标移动事件
*
****************************/
void Login::mouseMoveEvent(QMouseEvent *event)
{
//若鼠标左键被按下
// qDebug()<<"mouse_press="<<event->globalPos();
if(mouse_press)
{
i++;
//鼠标相对于屏幕的位置
QPoint move_pos = event->globalPos();
qDebug()<<"移动"<<i;
//移动主窗体位置
this->move(move_pos - move_point);
}
}
/****************************
* Function: eventFilter(QObject *object, QEvent *e)
*
* Description:
* 事件
*
****************************/
bool Login::eventFilter(QObject *object, QEvent *e)
{
if(e->type()==QEvent::MouseButtonPress&&object==ui->label_3)
{
close();
}
else if(e->type()==QEvent::MouseButtonPress&&object==ui->label_2){
showMinimized();
qDebug()<<"最小化";
}
else if(e->type()==QEvent::MouseButtonPress&&object==ui->label_5){
QDesktopServices::openUrl(QUrl("http://www.baidu.com"));
mouse_press=false;
}
return false;
}
/****************************
* Function: on_pushButton_clicked()
*
* Description:
* 登录按键触发事件
*
****************************/
void Login::on_pushButton_clicked()
{
showWidget *show_ui = new showWidget;
Sunshine *sun_ui = new Sunshine;
QObject::connect(this,SIGNAL(inShowUI(QString,QString)),show_ui,SLOT(in_ShowUI(QString, QString)));
//获取账号密码
user_account = ui->lineEdit->text();
QString pasd = ui->lineEdit_2->text();
QSettings *readIni = new QSettings("all_user.ini",QSettings::Format::IniFormat);
readIni->beginGroup(user_account); //获取节点位置
QString value = readIni->value("password").toString(); //获取密码值
QString name = readIni->value("name").toString(); //获取用户名
QString head = readIni->value("head_portrait").toString(); //获取用户名
qDebug()<<ui->lineEdit->text();
qDebug()<< "126___password " << value << endl;
qDebug()<< "127___name " << name << endl;
if(ui->lineEdit->text()==""||ui->lineEdit_2->text()==""){
qDebug()<<"内容为空";
ui->label_6->setText("账号密码不能为空");
}
else if(pasd == value && pasd != NULL) //账号密码匹配
{
readIni->endGroup();
ui->label_6->hide();
ui->pushButton->hide();
ui->lineEdit->hide();
ui->lineEdit_2->hide();
ui->label_5->hide();
ui->label_7->hide();
animation->start();
sleep(3000);
this->hide();
//emit inIndexUi(name, head);
emit inShowUI(name, head);
sun_ui->show();
sleep(3000);
show_ui->show();
}
else
{
QMessageBox *msgBox;
msgBox = new QMessageBox("警告", ///--这里是设置消息框标题
"密码或账号错误!!", ///--这里是设置消息框显示的内容
QMessageBox::Critical, ///--这里是在消息框显示的图标
QMessageBox::Ok | QMessageBox::Default, ///---这里是显示消息框上的按钮情况
QMessageBox::Cancel | QMessageBox::Escape, ///---这里与 键盘上的 escape 键结合。当用户按下该键,消息框将执行cancel按钮事件
0); ///---这里是 定义第三个按钮, 该例子 只是 了显示2个按钮
msgBox->show();
}
}
void Login::on_lineEdit_2_returnPressed()
{
qDebug()<<"输入结束66";
}
void Login::showEvent(QShowEvent *event)
{
mouse_press=false;
}
/*想要更多项目私wo!!!*/
void Login::on_lineEdit_textEdited(const QString &arg1)
{
qDebug()<<"正在编辑"+arg1;
if(ui->label_6->text()!=""){
qDebug()<<"进入了这个函数";
ui->label_6->setText("");
}
}