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日

相关文章

  • Spring @Conditional注解从源码层讲解

    下面是“Spring @Conditional注解从源码层讲解”的完整攻略。 什么是@Conditional注解 @Conditional是Spring框架中的一种条件注解,可以根据Condition接口的实现类判断是否满足某个条件,从而实现动态控制是否创建某个bean或者配置某个bean的属性。 @Conditional注解的源码实现 在Spring源码中…

    other 2023年6月27日
    00
  • 使用MyBatis-Generator如何自动生成映射文件

    以下是使用MyBatis-Generator自动生成映射文件的完整攻略: 配置MyBatis-Generator 在项目的pom.xml文件中添加MyBatis-Generator的依赖,并配置generatorConfig.xml文件。示例配置如下: xml <dependencies> <!– MyBatis-Generator依赖 …

    other 2023年10月14日
    00
  • ntfs for mac之mac无法识别移动ntfs磁盘的解决方法

    针对这个主题,我将给出以下完整攻略。 问题描述 有些用户在使用 Mac 电脑连接 NTFS 格式的移动硬盘时会发现无法读取,或者只读不能复制、修改。这是因为 Mac 系统本身并不支持 NTFS 文件格式,需要安装第三方软件才可以实现读写 NTFS 移动磁盘。 解决方法 在 Mac 上需要安装 NTFS for Mac(也叫 NTFS-3G)这款第三方软件才能…

    other 2023年6月27日
    00
  • onedrive不能上了?dns被污染 解决方法很简单

    以下是“onedrive不能上了?dns被污染 解决方法很简单的完整攻略”的详细说明,包括过程中的两个示例说明。 onedrive不能上了?dns被污染 解决方法很简单 如果您无法访问OneDrive,可能是因为DNS被污染。以下是一份关于如何解决OneDrive DNS污染完整略。 1. 修改hosts文件 在Windows系统中,可以通过修改hosts文…

    other 2023年5月10日
    00
  • java获取当前日期的四种方法

    获取当前日期是Java开发中常见的需求。下面共有四种方法可以实现此功能。 方法一:使用Date类 使用Java自带的Date类可以方便地获取当前日期。代码如下: import java.util.Date; public class GetCurrentDate { public static void main(String[] args) { Date …

    其他 2023年4月16日
    00
  • mybatisplus之—basemapper

    MyBatis-Plus之BaseMapper MyBatis-Plus是MyBatis的增强工具,提供了许多实用的功能,其中一就是BaseMapper。BaseMapper是MyBatis-Plus提供一个通用Mapper接口,可以用于快开发数据访问层(DAO)本略将介绍BaseMapper的基本用法和示例。 基本用法 BaseMapper提供许多常用的数…

    other 2023年5月9日
    00
  • 解决asp.net上传文件时文件太大导致的错误

    解决ASP.NET上传文件时文件太大导致的错误 在ASP.NET的应用程序中,当用户上传大文件时,有时会因为文件太大而导致错误。这种错误通常是由于ASP.NET应用程序默认上传文件大小限制导致的。如果您想上传大文件,您需要增大文件上传大小的限制。以下是解决ASP.NET上传文件时文件太大导致的错误的方法: 方法1:通过Web.Config配置文件增大上传文件…

    其他 2023年3月28日
    00
  • 接口自动化测试框架(一):apiautotest框架

    接口自动化测试框架(一):apiautotest框架 在进行软件开发的过程中,接口自动化测试是保证软件质量和项目稳定性的重要环节,减少了测试人员进行测试的工作量,提高了测试效率和测试质量。因此,开发一款易用、高效的接口自动化测试框架就显得尤为重要。 本文介绍的apiautotest框架是一款基于Python语言的接口自动化测试框架,其主要特点包括: 简单易用…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部