21xrx.com
2024-11-05 18:55:13 Tuesday
登录
文章检索 我的文章 写文章
C++实现仿QQ聊天程序
2023-07-05 10:03:33 深夜i     --     --
C++ QQ聊天 实现 程序

QQ是目前国内最为普及的聊天工具之一,其功能包括好友聊天、群聊、文件传输、语音视频通话等多个方面。如果你对C++编程有一定的基础,也可以利用C++来编写一个仿QQ的聊天程序。下面将介绍如何使用C++来实现一个简单的仿QQ聊天程序。

1. 基本框架

首先,我们需要设计程序的基本框架。一个简单的仿QQ聊天程序通常需要以下几个部分:

- 用户登录窗口(Login Window)

- 主界面(Main Window)

- 与好友聊天界面(Chat Window)

- 好友列表(Friend List)

- 好友信息窗口(Friend Detail)

- 消息记录(Message History)

2. 登录窗口

我们需要创建一个登录窗口,让用户输入账号和密码。在C++中可以使用Qt框架来设计窗口,实现登录窗口的代码如下:


#include <QtWidgets/QApplication>

#include <QtWidgets/QWidget>

#include <QtWidgets/QLineEdit>

#include <QtWidgets/QPushButton>

#include <QtWidgets/QLabel>

int main(int argc, char *argv[])

{

  QApplication app(argc, argv);

  //创建登录窗口

  QWidget* login = new QWidget();

  login->setWindowTitle("Login");

  //创建控件

  QLabel* label_account = new QLabel(login);

  label_account->setText("账号:");

  QLineEdit* le_account = new QLineEdit(login);

  QLabel* label_password = new QLabel(login);

  label_password->setText("密码:");

  QLineEdit* le_password = new QLineEdit(login);

  QPushButton* btn_login = new QPushButton(login);

  btn_login->setText("登录");

  //设置控件位置

  label_account->move(50, 80);

  le_account->move(100, 80);

  label_password->move(50, 120);

  le_password->move(100, 120);

  btn_login->move(150, 160);

  //显示窗口

  login->resize(300, 200);

  login->show();

  //消息循环

  return app.exec();

}

3. 主窗口和左侧面板

在用户成功登录后,我们需要显示主窗口,包括左侧面板和右侧面板。左侧面板通常包括好友列表和搜索框,右侧面板则是显示聊天内容。实现代码如下:


#include <QtWidgets/QMainWindow>

#include <QtWidgets/QGridLayout>

#include <QtWidgets/QVBoxLayout>

#include <QtWidgets/QHBoxLayout>

#include <QtWidgets/QLabel>

#include <QtWidgets/QPushButton>

#include <QtWidgets/QLineEdit>

#include <QtWidgets/QListWidget>

#include <QtWidgets/QTextEdit>

int main(int argc, char *argv[])

{

  QApplication app(argc, argv);

  //创建登录窗口略...

  //创建主窗口

  QMainWindow* main_window = new QMainWindow();

  main_window->setWindowTitle("仿QQ聊天");

  main_window->resize(800, 600);

  //创建左侧面板

  QWidget* left_panel = new QWidget();

  left_panel->setObjectName("left_panel");

  QGridLayout* left_layout = new QGridLayout();

  QLabel* label_search = new QLabel("搜索:");

  QLineEdit* le_search = new QLineEdit();

  le_search->setPlaceholderText("请输入好友昵称或账号");

  //好友列表

  QListWidget* friend_list = new QListWidget();

  left_layout->addWidget(label_search, 0, 0);

  left_layout->addWidget(le_search, 0, 1);

  left_layout->addWidget(friend_list, 1, 0, 1, 2);

  left_panel->setLayout(left_layout);

  //创建右侧面板略...

  //设置主窗口布局

  QHBoxLayout* main_layout = new QHBoxLayout();

  main_layout->setSpacing(0);

  main_layout->setMargin(0);

  main_layout->addWidget(left_panel);

  main_layout->addWidget(right_panel);

  QWidget* central = new QWidget(main_window);

  central->setLayout(main_layout);

  main_window->setCentralWidget(central);

  //显示主窗口

  main_window->show();

  //消息循环

  return app.exec();

}

4. 聊天窗口和信息记录

当用户选中好友进行聊天时,我们需要打开一个聊天窗口,并显示之前的聊天记录。实现聊天窗口和信息记录的代码如下:


void MainWindow::on_friend_list_doubleClicked(const QModelIndex& index)

{

  //获取好友信息

  QString friend_name = index.data().toString();

  //创建聊天窗口

  ChatWindow* chat_window = new ChatWindow();

  chat_window->setWindowTitle("与" + friend_name + "聊天中...");

  //创建信息记录窗口

  MessageHistory* message_history = new MessageHistory();

  message_history->setWindowTitle("与" + friend_name + "的聊天记录");

  //添加到Tab页中

  QTabWidget* tab_widget = qobject_cast<QTabWidget*>(this->centralWidget()->children().at(1));

  int index_new_tab = tab_widget->addTab(chat_window, friend_name);

  tab_widget->addTab(message_history, friend_name + "的聊天记录");

  //设置当前Tab页为聊天窗口

  tab_widget->setCurrentIndex(index_new_tab);

}

...

//信息记录窗口

class MessageHistory : public QTextEdit {

public:

  MessageHistory(QWidget* parent = 0) : QTextEdit(parent) {

    setReadOnly(true);

    QFont font;

    font.setFamily("Arial");

    font.setPointSize(12);

    setFont(font);

  }

  ~MessageHistory() {}

  void appendMessage(QString message) {

    append("[" + QDateTime::currentDateTime().toString() + "]" + message);

  }

};

//聊天窗口

class ChatWindow : public QWidget {

public:

  ChatWindow(QWidget* parent = 0) : QWidget(parent) {

    QVBoxLayout* layout = new QVBoxLayout();

    //聊天记录

    message_history = new MessageHistory(this);

    message_history->setMinimumHeight(300);

    layout->addWidget(message_history);

    //消息输入框

    QHBoxLayout* input_layout = new QHBoxLayout();

    QLineEdit* le_message_input = new QLineEdit();

    QPushButton* btn_send = new QPushButton();

    btn_send->setText("发送");

    input_layout->addWidget(le_message_input);

    input_layout->addWidget(btn_send);

    layout->addLayout(input_layout);

    setLayout(layout);

    //发送按钮信号槽

    connect(btn_send, SIGNAL(clicked()), this, SLOT(on_send_message()));

  }

  ~ChatWindow() {}

private:

  MessageHistory* message_history;

private slots:

  void on_send_message() {

    QString message = qobject_cast<QLineEdit*>(sender()->parentWidget()->children().at(0))->text();

    if (message.isEmpty())

      return;

    

    message_history->appendMessage("\n我:" + message);

    qobject_cast<QLineEdit*>(sender()->parentWidget()->children().at(0))->setText("");

  }

};

5. 完整代码

上述代码只是程序的基本框架和部分实现代码,完整的仿QQ聊天程序实现代码可参考以下链接:

https://github.com/yc8544197/Cpp_QQ_chat

通过此程序的编写,你可以加深对C++编程和Qt框架的理解,同时学习如何通过面向对象的思想来设计和实现一个完整的软件系统。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复