QT聊天系统类似QQ聊天(基于TCP、UDP)

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("");
    }

}
  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
实现qt仿qq聊天传文件的主要步骤如下: 1. 在聊天窗口中添加一个发送文件的按钮,当用户点击该按钮时,弹出文件选择对话框。 2. 用户选择要发送的文件后,将文件路径发送给接收方,并显示在聊天框中。 3. 将要发送的文件转换为二进制流,通过网络传输给接收方。 4. 接收方接收到文件后,将二进制流转换为文件并保存到本地。 具体实现可以参考以下步骤: 1. 在Qt中使用QFileDialog类实现文件选择对话框。 ```cpp QString filePath = QFileDialog::getOpenFileName(this, tr("选择文件"), "", tr("所有文件 (*)")); ``` 2. 将文件路径发送给接收方,可以将文件路径作为文本消息发送。 ```cpp QString message = QString("%1:%2").arg(MessageType::File).arg(filePath); send(message); ``` 3. 将要发送的文件转换为二进制流,可以使用QFile和QByteArray类实现。 ```cpp QFile file(filePath); if (!file.open(QIODevice::ReadOnly)) { return; } QByteArray fileData = file.readAll(); file.close(); ``` 4. 将二进制流发送给接收方,可以使用QTcpSocket类实现。 ```cpp QDataStream out(&socket); out << fileData; ``` 5. 接收方接收到文件后,将二进制流转换为文件并保存到本地。 ```cpp QDataStream in(&socket); QByteArray fileData; in >> fileData; QFile file(filePath); if (!file.open(QIODevice::WriteOnly)) { return; } file.write(fileData); file.close(); ``` 以上是实现qt仿qq聊天传文件的基本步骤,具体实现还需要根据自己的需求进行修改和完善。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值