Qt 实现聊天软件中自定义表情包(随笔记录)

本文记录了如何使用Qt框架实现聊天软件中的自定义表情包功能,包括设置表情的行列数、大小和数量,以及展示了EmoticonsWidget和SmileyPack关键代码,实现了表情包窗口和表情包的封装。
摘要由CSDN通过智能技术生成

 

简述:

QT实现自定义表情包,通过对(能够设置表情的行列数 , 表情的大小,表情的个数、最大行数等)

效果:

                           

代码如下:

EmoticonsWidget主要实现表情包窗口。

EmoticonsWidget.cpp

#include "EmoticonsWidget.h"
#include "SmileyPack.h"

#include <QFile>
#include <QGridLayout>
#include <QLayout>
#include <QMouseEvent>
#include <QPushButton>
#include <QRadioButton>
#include <QDebug>

#include <math.h>

QString getStylesheet(const QString& filename)
{
	QFile file(filename);
	if (!file.open(QFile::ReadOnly | QFile::Text)) {
		qWarning() << "Stylesheet " << filename << " not found";
		return QString();
	}

	return file.readAll();
}


EmoticonsWidget::EmoticonsWidget(QWidget* parent)
    : QMenu(parent)
{
    setStyleSheet(getStylesheet(":/ui/EmoticonWidget.css"));
    setLayout(&layout);
    layout.addWidget(&stack);

    QWidget* pageButtonsContainer = new QWidget;
    QHBoxLayout* buttonLayout = new QHBoxLayout;
    pageButtonsContainer->setLayout(buttonLayout);

    layout.addWidget(pageButtonsContainer);

    const int maxCols = 8;
    const int maxRows = 8;
    const int itemsPerPage = maxRows * maxCols;

    const QList<QStringList>& emoticons = SmileyPack::getInstance().getEmoticons();
    int itemCount = emoticons.size();
    int pageCount = ceil(float(itemCount) / float(itemsPerPage));
    int currPage = 0;
    int currItem = 0;
    int row = 0;
    int col = 0;

    // 配置表情大小
    const int px = 40;
    const QSize size(px, px);

    // 创建页面
    buttonLayout->addStretch();
    for (int i = 0; i < pageCount; ++i) {
        QGridLayout* pageLayout = new QGridLayout;
        pageLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding),
                            maxRows, 0);
        pageLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum), 0,
                            maxCols);

        QWidget* page = new QWidget;
        page->setLayout(pageLayout);
        stack.addWidget(page);

        // 只有当页面超过1个时才需要页面按钮
        if (pageCount > 1) {
            QRadioButton* pageButton = new QRadioButton;
            pageButton->setProperty("pageIndex", i);
            pageButton->setCursor(Qt::PointingHandCursor);
            pageButton->setChecked(i == 0);
            buttonLayout->addWidget(pageButton);

            connect(pageButton, &QRadioButton::clicked, this, &EmoticonsWidget::onPageButtonClicked);
        }
    }
    buttonLayout->addStretch();

    SmileyPack& smileyPack = SmileyPack::getInstance();
    for (const QStringList& set : emoticons) {
        QPushButton* button = new QPushButton;
        std::shared_ptr<QIcon> icon = smileyPack.getAsIcon(set[0]);
        emoticonsIcons.append(icon);
        button->setIcon(icon->pixmap(size));
        button->setToolTip(set.join(" "));
        button->setProperty("sequence", set[0]);
        button->setCursor(Qt::PointingHandCursor);
        button->setFlat(true);
        button->setIconSize(size);
        button->setFixedSize(size);

        connect(button, &QPushButton::clicked, this, &EmoticonsWidget::onSmileyClicked);

        qobject_cast
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值