Qt+QListWidget实现气泡聊天界面(附源码)

下面是详细讲解“Qt+QListWidget实现气泡聊天界面(附源码)”的完整攻略:

1.准备工作

首先,需要在Qt中新建一个项目,选择"Qt Widgets Application",然后依次填写项目名称、路径等信息即可。接着,在项目中添加一个QListWidget控件,并根据需要添加其他控件,比如QPushButton、QLineEdit等。

2.实现气泡聊天界面

2.1 数据模型

气泡聊天界面的核心是消息数据,因此需要创建一个消息类Message,用于存储消息的内容、发送者、接收者和时间等信息。具体实现如下:

enum MessageType{
    Me, 
    You
}; //枚举类型,用于标识消息的发送者和接收者

struct Message{
    QString content;  //消息内容
    MessageType type; //消息发送者类型
    QDateTime time;   //消息发送时间

    Message(QString content, MessageType type, QDateTime time){
        this->content = content;
        this->type = type;
        this->time = time;
    }
};

2.2 UI布局

接着,需要设计气泡聊天界面的UI布局。布局可以分为两部分,分别是左边为当前用户列表,右边为聊天界面。当用户点击用户列表中的某个用户时,聊天界面会显示与该用户的聊天记录。具体实现如下:

void initUserList(){
    ui->listWidgetUser->addItems(users); //向用户列表中添加用户
    connect(ui->listWidgetUser, &QListWidget::currentTextChanged, this, &MainWindow::changeUser);
}

void changeUser(QString username)//切换聊天对象
{
    updateChatRecords(username);
}

void updateChatRecords(QString username) //更新聊天记录
{
    QList<Message> records = chatRecords[username];
    ui->listWidgetChat->clear();
    for(Message msg : records){
        addMessage((msg.type == Me) ? username : "我", msg.content, (msg.type == Me) ? MsgType_Me : MsgType_You, msg.time.toString("yyyy-MM-dd hh:mm:ss"));
    }
    ui->listWidgetChat->scrollToBottom();
}

void addMessage(QString username, QString content, MsgType type, QString time)
{
    QListWidgetItem * item = new QListWidgetItem(ui->listWidgetChat); //新建一个QListWidgetItem对象
    item->setSizeHint(QSize(0, 40)); //设置QListWidgetItem的高度为40
    ChatBubble * bubble = new ChatBubble(ui->listWidgetChat); //新建一个聊天气泡
    bubble->setUserName(username); //设置用户姓名
    bubble->setText(content); //设置气泡内容
    bubble->setMsgType(type); //设置气泡类型
    bubble->setTime(time); //设置气泡时间
    ui->listWidgetChat->setItemWidget(item, bubble); //将气泡插入到QListWidgetItem中
}

2.3 聊天气泡

接下来,需要实现聊天气泡。聊天气泡是气泡聊天界面中最重要的组件之一,它可以显示用户的头像、消息内容、消息类型和发送时间等信息。具体实现如下:

class ChatBubble : public QWidget
{
    Q_OBJECT
public:
    explicit ChatBubble(QWidget *parent = 0);

    void setUserName(QString username); //设置用户姓名
    void setText(QString text); //设置气泡内容
    void setMsgType(MsgType type); //设置气泡类型
    void setTime(QString timeStr); //设置气泡时间

private:
    void paintEvent(QPaintEvent *event);
    QSize sizeHint() const;

    QString userName; //用户名
    QString text; //气泡内容
    MsgType msgType; //气泡类型
    QString timeStr; //气泡时间
};

聊天气泡的样式可以通过paintEvent函数绘制,这里不再赘述。完整代码可以参考“附源码”中的ChatBubble.cpp和ChatBubble.h文件。

2.4 完整实现

最后,将以上三个部分组合在一起,就可以实现气泡聊天界面了。完整代码可以参考“附源码”中的MainWindow.cpp和MainWindow.h文件。

示例说明

示例1:添加新的消息气泡

要添加一条新的消息气泡,可以使用addMessage函数,该函数的参数包括:消息发送者的用户名、消息内容、消息类型和消息发送时间。下面是示例代码:

QDateTime currentDateTime = QDateTime::currentDateTime(); //获取当前时间
QString timeStr = currentDateTime.toString("yyyy-MM-dd hh:mm:ss"); //格式化时间字符串
addMessage("用户1", "你好,欢迎来到我的主页!", MsgType_You, timeStr); //添加一条接收消息

示例2:更新聊天记录

如果要更新聊天记录,可以使用updateChatRecords函数,该函数的参数为要更新的聊天对象的用户名。下面是示例代码:

updateChatRecords("用户1"); //更新用户1的聊天记录

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Qt+QListWidget实现气泡聊天界面(附源码) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Android开发准确获取手机IP地址的两种方式

    Android开发准确获取手机IP地址的两种方式 在Android开发中,有时候我们需要获取手机的IP地址来进行网络通信或者其他操作。下面将介绍两种准确获取手机IP地址的方式。 1. 使用WifiManager获取IP地址 WifiManager是Android系统提供的一个用于管理Wi-Fi连接的类。通过WifiManager,我们可以获取到当前连接的Wi…

    other 2023年7月30日
    00
  • 启用https协议的方法

    下面是“启用HTTPS协议的方法的完整攻略”的详细讲解,包括HTTPS协议的基本概念、启用HTTPS协议的方法、两个示例说明等方面。 HTTPS协议的基本概念 HTTPS(Hypertext Transfer Protocol Secure)是一种基于TLS/SSL协议的安全HTTP协议,用于保护网络通信的安全性和隐私性。HTTPS协议通过使用TLS/SSL…

    other 2023年5月5日
    00
  • Android手把手教大家制作APP首页(下拉刷新、自动加载)

    Android手把手教大家制作APP首页(下拉刷新、自动加载)完整攻略 1. 引入依赖库 在build.gradle文件中添加以下依赖: implementation ‘com.github.yalantis:PullToRefresh:1.2.0’ 2. 创建布局文件 在activity_main.xml文件中添加PullToRefreshView和Rec…

    other 2023年6月25日
    00
  • Android M版本号确认为Android 5.2 加入Demo mode

    Android M版本号确认为Android 5.2 加入Demo mode攻略 简介 Android M是Android操作系统的一个重要版本,其版本号已确认为Android 5.2。此外,Android M还引入了一个新功能,即Demo mode(演示模式),该模式可以用于展示设备的功能和特性,非常适用于展会、演示和教学等场景。本攻略将详细介绍如何确认A…

    other 2023年8月3日
    00
  • Android 自定义RecyclerView 实现真正的Gallery效果

    Android 自定义RecyclerView 实现真正的Gallery效果 在Android开发中,我们经常会使用RecyclerView控件来创建列表,并且它的用法十分灵活,可以满足各种不同场景的需要。但是,在某些情况下,我们可能需要将RecyclerView的排版方式更改为横向滚动,实现类似于Gallery控件的效果。本文将介绍如何自定义Recycle…

    其他 2023年3月28日
    00
  • K8S 中 kubectl 命令详解

    K8S 中 kubectl 命令详解 什么是 kubectl kubectl 是 Kubernetes 中的一个命令行工具,它允许您与 Kubernetes 集群进行交互,并且可以使用它来管理应用程序、服务、资源等。 使用 kubectl 在使用 kubectl 之前,需先配置好与 Kubernetes 集群的连接方式。 连接到 Kubernetes 集群 …

    other 2023年6月27日
    00
  • ios国际化最新最全教程+如何快速国际化一个现成app

    iOS国际化最新最全教程+如何快速国际化一个现成App 随着全球市场的逐渐开放,越来越多的App需要适应不同语言和地区的用户需求,进行国际化已经成为了一项必要的开发工作。本文将介绍如何在iOS开发中实现国际化,包括以下内容: 国际化基础知识 项目中的国际化 如何快速的国际化一个现成的App 国际化基础知识 什么是国际化? 国际化(Internationali…

    其他 2023年3月28日
    00
  • javascript使用activex控件的代码

    当使用JavaScript操作IE浏览器时,可以通过ActiveX控件实现一些特殊的功能。以下是使用ActiveX控件的JavaScript代码攻略: 步骤1:创建ActiveX控件 首先需要创建ActiveX控件实例,可以通过JavaScript的new ActiveXObject()函数来实现。该函数的参数是需要创建的ActiveX控件对象名称,例如创建…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部