Qt模仿QQ聊天窗口界面(二)

Qt模仿QQ聊天窗口界面(二)

简述

在上篇我们已经搭好了QQ聊天窗口的框架,这里在原来的基础上叠加功能,以及优化一些控件。

修改

1.优化表情窗口
2.优化聊天窗口右侧边栏按钮显示问题。
3.优化聊天窗口滚动条样式问题。
4.增加消息编辑框功能
5.增加聊天窗口字体设置,包括颜色,大小,加粗,斜体,下划线。
6.增加了,模仿QQ来消息时,滚动条下侧按钮闪烁功能。

效果图

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

后期规划

Qt模仿QQ聊天窗口界面(三)
1.增加QQ截图功能

Qt模仿QQ聊天窗口界面(四)
1.增加聊天窗口气泡消息功能

代码

#include "talkwindow.h"

#include <QTextCursor>
#include <QMovie>
#include <QImage>
#include <QScrollBar>
#include <QMenu>
#include <QPainter>
#include <QTimer>
#include <QDebug>
#include <QFontDatabase>
#include <QColorDialog> 

TalkWindow::TalkWindow(QWidget *parent)
    : QWidget(parent)
    , m_bshowbox(false)
{
    setAttribute(Qt::WA_DeleteOnClose);
    ui.setupUi(this);
    initControl();
    initFontWidget();
}

TalkWindow::~TalkWindow()
{

}

void TalkWindow::initControl()
{
    setSendBtnMenu();
    QList<int> rightWidgetSize;
    rightWidgetSize << 600 << 138;
    ui.bodySpliter->setSizes(rightWidgetSize);

    m_updateDownArrowtimer = new QTimer(this);
    connect(m_updateDownArrowtimer, SIGNAL(timeout()), this, SLOT(onUpdateDownArrowtimer()));
    m_updateDownArrowtimer->setInterval(500);

    connect(ui.sysmin, SIGNAL(clicked(bool)), parent(), SLOT(onShowMin(bool)));
    connect(ui.sysclose, SIGNAL(clicked(bool)), parent(), SLOT(onShowClose(bool)));
    connect(ui.closeBtn, SIGNAL(clicked(bool)), parent(), SLOT(onShowClose(bool)));

    connect(ui.fontBtn, SIGNAL(clicked(bool)), this, SLOT(onFontBtnClicked(bool)));
    connect(ui.faceBtn, SIGNAL(clicked(bool)), parent(), SLOT(onEmotionBtnClicked(bool)));
    connect(ui.sendBtn, SIGNAL(clicked(bool)), this, SLOT(onSendBtnClicked(bool)));

    ui.fontWidget->setVisible(false);
    ui.scrollArea->setShowSkinControl(ui.skinLabel);
    ui.skinLabel->setSpliterButton(ui.scrollArea->getTalkWindowSpliterButton());
}

void TalkWindow::initFontWidget()
{
    QFontDatabase database;
    foreach(const QString &family, database.families())
    {
        ui.fontfamilyCombox->addItem(family);
    }

    for (int fontsize = 9; fontsize < 22; fontsize++)
    {
        ui.fontsizeCombox->addItem(QString::number(fontsize));
    }

    connect(ui.fontfamilyCombox, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(onFontFamilycurrentIndexChanged(const QString &)));
    connect(ui.fontsizeCombox, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(onFontSizecurrentIndexChanged(const QString &)));
    connect(ui.boldBtn, SIGNAL(clicked(bool)), this, SLOT(onBoldBtnCLicked(bool)));
    connect(ui.italBtn, SIGNAL(clicked(bool)), this, SLOT(onItalBtnCLicked(bool)));
    connect(ui.underBtn, SIGNAL(clicked(bool)), this, SLOT(onUnderBtnCLicked(bool)));
    connect(ui.colorBtn, SIGNAL(clicked(bool)), this, SLOT(onColorBtnCLicked(bool)));
    connect(ui.textEdit, &QTextEdit::currentCharFormatChanged, this, &TalkWindow::currentCharFormatChanged);
}

void TalkWindow::onFontFamilycurrentIndexChanged(const QString &family)
{
    m_font.family = family;
    QTextCharFormat fmt;
    fmt.setFontFamily(family);
    mergeFormatOnWordOrSelection(fmt);
    ui.textEdit->setFontFamily(family);
    ui.textEdit->setFocus();
}

void TalkWindow::onFontSizecurrentIndexChanged(const QString &size)
{
    m_font.fontsize = size.toInt();
    QTextCharFormat fmt;
    fmt.setFontPointSize(size.toInt());
    mergeFormatOnWordOrSelection(fmt);
    ui.textEdit->setFontPointSize(size.toInt());
    ui.textEdit->setFocus();
}

void TalkWindow::onBoldBtnCLicked(bool)
{
    QTextCharFormat fmt;
    if (ui.textEdit->fontWeight() == QFont::Bold)
    {
        m_font.bold = QFont::Normal;
        fmt.setFontWeight(QFont::Normal);
        ui.textEdit->setFontWeight(QFont::Normal);
    }
    else
    {
        m_font.bold = QFont::Bold;
        fmt.setFontWeight(QFont::Bold);
        ui.textEdit->setFontWeight(QFont::Bold);
    }
    mergeFormatOnWordOrSelection(fmt);
    ui.textEdit->setFocus();
}

void TalkWindow::onItalBtnCLicked(bool)
{
    bool ital = ui.textEdit->fontItalic();
    m_font.ital = !ital;
    QTextCharFormat fmt;
    fmt.setFontItalic(!ital);
    mergeFormatOnWordOrSelection(fmt);
    ui.textEdit->setFontItalic(!ital);
    ui.textEdit->setFocus();
}

void TalkWindow::onUnderBtnCLicked(bool)
{
    bool underline = ui.textEdit->fontUnderline();
    m_font.underline = !underline;
    QTextCharFormat fmt;
    fmt.setFontUnderline(!underline);
    mergeFormatOnWordOrSelection(fmt);
    ui.textEdit->setFontUnderline(!underline);
    ui.textEdit->setFocus();
}

void TalkWindow::onColorBtnCLicked(bool)
{
    QColorDialog colorDialog;
    QColor color = colorDialog.getColor(ui.textEdit->textColor(), this, QStringLiteral("选择字体颜色"));
    m_font.color = color;
    QTextCharFormat fmt;
    fmt.setForeground(color);
    mergeFormatOnWordOrSelection(fmt);
    ui.textEdit->setTextColor(color);
    ui.textEdit->setFocus();
}

void TalkWindow::mergeFormatOnWordOrSelection(const QTextCharFormat &format)
{
    QTextCursor cursor = ui.textEdit->textCursor();
    if (!cursor.hasSelection())
        cursor.select(QTextCursor::Document);
    cursor.mergeCharFormat(format);
    ui.textEdit->mergeCurrentCharFormat(format);
}

void TalkWindow::currentCharFormatChanged(const QTextCharFormat &format)
{
    ui.textEdit->setFontFamily(m_font.family);
    ui.textEdit->setFontPointSize(m_font.fontsize);
    ui.textEdit->setFontWeight(m_font.bold);
    ui.textEdit->setFontItalic(m_font.ital);
    ui.textEdit->setFontUnderline(m_font.underline);
    ui.textEdit->setTextColor(m_font.color);
}

void TalkWindow::onFontBtnClicked(bool)
{
    if (ui.fontWidget->isVisible())
    {
        ui.fontWidget->setVisible(false);
        ui.fontBtn->setChecked(false);
    }
    else
    {
        ui.fontWidget->setVisible(true);
        ui.fontBtn->setChecked(true);
    }
    update();
}

void TalkWindow::onSetEmotionBtnStatus()
{
    ui.faceBtn->setChecked(false);
}

void TalkWindow::setWindowName(const QString& name)
{
    ui.nameLabel->setText(name);
}

void TalkWindow::setWindowSignName(const QString& name)
{
    ui.signLabel->setText(name);
}

void TalkWindow::onSignalWindowclosed()
{
    close();
}

void TalkWindow::onSendBtnClicked(bool)
{
    QTextDocument* document = ui.textEdit->document();
    ui.scrollArea->scrollToBottom(ui.msgWidget);

    ui.textEdit->clear();
    ui.textEdit->delteAllEmotionImage();
    m_updateDownArrowtimer->start();
}

void TalkWindow::addEmotionImage(int emotionNum)
{
    ui.textEdit->setFocus();
    ui.textEdit->addEmotionUrl(emotionNum);
}

void TalkWindow::setSendBtnMenu()
{
    QMenu* menu = new QMenu(this);
    menu->setWindowFlags(menu->windowFlags() | Qt::FramelessWindowHint);
    menu->setAttribute(Qt::WA_TranslucentBackground);
    menu->setObjectName("senMenu");
    m_sendAction = menu->addAction(QStringLiteral("按Enter键,发送消息"), this, SLOT(onEnterAction()));
    m_ctrlSendAction = menu->addAction(QStringLiteral("按Enter+Ctrl键,发送消息"), this, SLOT(onEnterCtrlAction()));

    QActionGroup* actiongroup = new QActionGroup(this);
    m_sendAction->setCheckable(true);
    m_ctrlSendAction->setCheckable(true);
    m_sendAction->setChecked(true);
    actiongroup->addAction(m_sendAction);
    actiongroup->addAction(m_ctrlSendAction);
    ui.sendBtn->setMenu(menu);
}

void TalkWindow::onEnterAction()
{
    m_sendAction->setChecked(true);
}

void TalkWindow::onEnterCtrlAction()
{
    m_ctrlSendAction->setChecked(true);
}

void TalkWindow::onUpdateDownArrowtimer()
{
    m_bshowbox = !m_bshowbox;
    update();
}

void TalkWindow::paintEvent(QPaintEvent *event)
{
    __super::paintEvent(event);
    QPainter painer(this);
    painer.setRenderHint(QPainter::SmoothPixmapTransform, this);
    painer.setPen(Qt::NoPen);
    int fotWidget = 0;
    if (ui.fontWidget->isVisible())
        fotWidget = ui.fontWidget->height();
    painer.drawPixmap(ui.bodyWidget->width() - 13, ui.titleWidget->height() + 2, QPixmap(":/TalkWindowShell/Resources/scrollbar_top_normal.gft.png"));
    painer.drawPixmap(ui.bodyWidget->width() - 13, ui.bodyWidget->height() + ui.titleWidget->height() - 14 - fotWidget, QPixmap(":/TalkWindowShell/Resources/scrollbar_down_normal.gft.png"));
    if (m_updateDownArrowtimer->isActive())
    {
        if (m_bshowbox)
        {
            painer.setPen(QColor(174, 193, 191));
            painer.drawRect(ui.bodyWidget->width() - 13, ui.bodyWidget->height() + ui.titleWidget->height() - 14 - fotWidget, 11, 11);
        }
    }
}

结尾

觉得博主写了这么多项目中,不错,还可以的。打赏下博主吧。博主写了这么久代码,脑细胞死了不少。得喝喝六个核桃补补,后期才能更好的为大家开源更多精彩的内容~对不对,嘿嘿~

这里写图片描述
这里写图片描述

关键部分
觉得代码篇不满足你需求的,可以大胆的加博主QQ:3246214072,提供完整的工程文件供你使用。有什么问题,欢迎咨询博主QQ。

  • 12
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: "1953639865" 是一个QQ号码。QQ是由腾讯公司开发的一种即时通讯软件。这个号码代表着一个特定的用户账号,使用这个账号可以在QQ平台上进行聊天、发送消息、视频通话、网络游戏等各种社交活动。 QQ号码是通过注册QQ账号时由系统自动生成的,每个账号独一无二。这个号码通常用于标识用户的身份,其他用户可以通过该号码添加好友或者与其进行交流。QQ号码也可以用于登录QQ邮箱、QQ空间等腾讯公司旗下的各种产品和服务。 据QQ官方统计数据,QQ目前已经成为全球最大的在线社交平台之一,在互联网使用者中非常流行。用户可以通过QQ号码与家人、朋友、同事等建立联系,进行及时沟通和交流。在QQ平台上,用户可以创建个人资料、上传照片与动态,还可以通过加入不同的兴趣群体、订阅公众号等方式,扩大社交圈子和获取感兴趣的信息。 总之,1953639865 qq 是一个QQ号码,代表着一个特定用户的账号。在QQ平台上,用户可以通过QQ号码进行各种社交和通讯活动,与其他用户建立联系并享受QQ平台提供的各种功能和服务。 ### 回答2: 1953639865 qq是一个QQ号码。QQ是腾讯公司开发的一款即时通讯软件,是中国最受欢迎的社交平台之一。QQ号码是用户在注册QQ账号时生成的一个唯一标识。1953639865 qq是一个由数字组成的QQ号码,它可以用来识别和区分不同的QQ用户。通过QQ号码,用户可以添加好友、发送消息、进行语音通话、分享照片等交流活动。在互联网和移动通信的普及下,QQ已经成为人们日常生活中不可或缺的工具之一。1953639865 qq作为一个特定的QQ号码,代表着一个具体的用户,这个用户可以和其他QQ用户进行各种形式的交流。每一个QQ号码都有其独特的含义和重要性,用户可以根据自己的喜好和需求选择自己喜欢的QQ号码,并通过该号码与其他用户进行联系。因此,1953639865 qq是一个个体用户的独特身份标识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨田哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值