关闭

Qt 之 QQ系统表情(二)

标签: qtqq表情
982人阅读 评论(0) 收藏 举报
分类:

简述

继上篇Qt 之 QQ系统表情(一) 中我们实现了简单的表情框,但是还遗留了一个问题,虽然我们能够显示动态的表情,但是总不能让表情框中的每一个表情都动态显示吧(见下图一),这样的效果显然不是我们要的,真正要实现的是当鼠标悬浮在某个表情上才让他动态显示,其他的都显示为静态样式(见图二)。好了,话不多说,代码走起!

图一
图一


图二
图二

代码之路

为了实现这个效果呢,我也是用了很多方法,最后发现了两种方法来达到这个效果。
先看一下QTableWidget的信号:

这里写图片描述

信号到是不少,但是有帮助的信号也就这两信号:

void cellEntered(int row, int column)
This signal is emitted when the mouse cursor enters a cell. The cell is specified by row and column.
This signal is only emitted when mouseTracking is turned on, or when a mouse button is pressed while moving into an item.
简而言之,当鼠标进入tableWidget中某个单元格时会发出。但是只有在mouseTracking 设置为true时,或者在鼠标的一个键被按下的同时鼠标进入tableWidget中某个单元格的。


void itemEntered(QTableWidgetItem * item)
This signal is emitted when the mouse cursor enters an item. The item is the item entered.
This signal is only emitted when mouseTracking is turned on, or when a mouse button is pressed while moving into an item.
单看英文注释发现和cellEntered信号意思差不多,基本算是一字之差,一个是cell一个是item,区别就在这里,仔细看下图中的输出,可以看出在鼠标进入每个单元格的时候都会触发cellEntered信号,而itemEntered信号只有在鼠标进入一个设置了item的单元格中才会触发。

这里写图片描述


测试这两个信号之后发现并没有什么卵用,只有在鼠标慢慢从一个单元格移动到另一个单元格中才会触发,当鼠标快速从一个单元格移动到另一个时这两个信号时有时无,具体可以看下图(图一),所以这两个信号并没有帮助,其实主要是给item设置了cellWidget的原因,如果未设置widget这两个信号是完全可以捕捉到鼠标移动到哪一个单元格(见图二)。
图一
这里写图片描述
图二
这里写图片描述

也有网上说用void entered(const QModelIndex & index)这个信号,效果也如上信号。信号不行,说不定事件就可以呢,继承了QTableWidget类,并重写了mouseMoveEvent事件,结果还是因为给item设置了cellWidget,当鼠标移动到表情图标时根本不会触发mouseMoveEvent事件,既然这个不行就试试eventFilter去专门捕捉mouseMove这个事件,结果当鼠标在图标上移动时根本不会触发mouseMove事件,详情见下图。

bool MyEmotionWidget::eventFilter(QObject *obj, QEvent *event)
{
    //鼠标在图标上移动时输出当前事件
    qDebug() << event->type();
    return __super::eventFilter(obj, event);
}

这里写图片描述

好吧,信号不行,事件也不行,这可咋办。经历重重失败,机智的我最终灵机一动,我干脆不捕捉信号了,我直接通过获取当前鼠标的位置来确定鼠标进入哪一个item,这就靠QTableWidget中的itemAt方法。

QTableWidgetItem * QTableWidget::itemAt(const QPoint & point) const

Returns a pointer to the item at the given point, or returns 0 if point is not covered by an item in the table widget.

代码如下

bool MyEmotionWidget::eventFilter(QObject *obj, QEvent *event)
{
    // 获取当前鼠标的位置
    QPoint point = QCursor::pos() - this->pos();
    // 根据鼠标的位置获取item
    QTableWidgetItem* tableWidgetItem = ui.tableWidget->itemAt(point);
    if (tableWidgetItem != NULL)
    {
        //m_preRow 和 m_preColumn 分别保存了上一次鼠标进入的单元格在QTableWidget中的位置
        //如果当前进入的还是同一个则不进行停止动态显示
        if(m_preRow != tableWidgetItem->row() || m_preColumn != tableWidgetItem->column())
        {
            // 将上一次鼠标进入的单元格中的表情停止动态显示
            QLabel* preEmotion = (QLabel*)ui.tableWidget->cellWidget(m_preRow, m_preColumn);
            if (preEmotion != NULL)
            {
                QMovie* preMoive = preEmotion->movie();
                // 恢复到动态表情图片的第一帧
                preMoive->jumpToFrame(0);
                preMoive->stop();
            }
        }
        // 将当前鼠标所在的单元格表情开始动态显示,先获取QLabel,再获取QMoive
        QLabel* curEmotion = (QLabel*)ui.tableWidget->cellWidget(tableWidgetItem->row(), tableWidgetItem->column());
        if (curEmotion != NULL)
        {
            QMovie* curMoive = curEmotion->movie();
            curMoive->start();
            m_preRow = tableWidgetItem->row();
            m_preColumn = tableWidgetItem->column();
        }
    }

    return __super::eventFilter(obj, event);
}

效果图

这里写图片描述

虽然实现了这个效果,但是在eventFilter方法中去根据获取鼠标当前位置获取item并不是十分妥当,下一篇将介绍另外的方法。

3
0
查看评论

Qt 之 QQ系统表情(一)

在走上Qt之路后,对QQ的界面便情有独钟,由衷感叹:一个字——美 两个字——很美 三个字——非常美 四个字——真TM美说实在QQ的界面做的很精、致,毕竟积累了十几年的功力。但是也有不足的地方,任何事物都不是十全十美的,最重要的是要做的尽善尽美。好了话不多说,代码走起。这次主要是对QQ聊天窗口的...
  • GoForwardToStep
  • GoForwardToStep
  • 2016-08-30 22:03
  • 2174

Qt 之 QQ系统表情—实现动态显示效果

简述在Qt 之 QQ系统表情(五) 中 我们实现了自定义系统表情窗口,这一篇将简单介绍如何实现QQ聊天界面中小表情窗口切换至正常表情窗口的动画效果。先看看QQ的效果: 当鼠标悬浮在表情按钮之上显示小表情窗口,点击动态显示正常表情窗口,再点击隐藏窗口。表面上看起来这几个动作很简单,但是要想控制好着...
  • GoForwardToStep
  • GoForwardToStep
  • 2016-09-26 22:15
  • 2838

Qt 之 QQ系统表情(四)

简述继Qt 之 QQ系统表情(三) 中我们用了两种方法实现了当前鼠标位置的表情动态显示,在这一篇中我们将对其进行拓展,增加一些新特效以及能够自定义表情窗口(包括表情的行列数 , 表情的大小,表情的个数、最大行数等)。好了,话不多说,代码走起。代码之路在Qt 之 QQ系统表情(三) 中,我们通过nat...
  • GoForwardToStep
  • GoForwardToStep
  • 2016-09-06 18:31
  • 1187

【Qt】仿QQ表情选择控件

表情选择控件在聊天应用中经常要用到,做起来虽然不复杂但是很繁琐,特别是有些图标需要按顺序排列。每次重做必然是很费时,所以我将聊天表情选择控件封装成一个独立的类QFaceSelectWidget,方便直接应用到自己的项目中。 先来看看效果图: 测试程序是一个对话框,里面放有一个QPushB...
  • xiaohui_hubei
  • xiaohui_hubei
  • 2014-08-24 15:36
  • 2515

Qt仿QQ界面,主界面、聊天界面、表情界面

利用Qt仿的QQ的界面如下:
  • llmys
  • llmys
  • 2017-06-09 20:24
  • 1125

Qt 之 QQ系统表情(三)

简述继上篇Qt 之 QQ系统表情(二) 中我们实现了当鼠标悬浮在某个表情时动态显示,其他的都显示为静态样式,但是方法并不是很好,下面我们介绍另外两种比较好的方法来实现这个效果。代码走起!代码之路上一篇,我们是通过在eventFilter中去捕捉鼠标当前的位置来获取到tableWidget中的item...
  • GoForwardToStep
  • GoForwardToStep
  • 2016-09-01 21:57
  • 1511

Qt 之 QQ系统表情(五)

简述在Qt 之 QQ系统表情(四) 中我们通过用nativeEvent事件的方法实现了自定义表情窗口,这一篇将通过继承QLabel的方式来实现。同时我也在研究过程中发现了一些小问题。代码Go!代码之路MyEmotionItemWidget.cppMyEmotionItemWidget::MyEmot...
  • GoForwardToStep
  • GoForwardToStep
  • 2016-09-07 08:50
  • 1968

微信和qq默认表情代码对照表及表情文件下载

微信字符含义:http://blog.wpjam.com/m/weixin-emotions/
  • u011500781
  • u011500781
  • 2016-03-16 19:15
  • 7239

qq表情正则替换

1.准备一套qq表情图片:如下:   图片的命名都是以f0开头,后面两位数字; 2.发送消息后,接受到后台的msg中,如:‘消息内容f003,文字文字~’,要把消息中的以f0开头的四位字符串替换成对应的qq表情图片: js代码: var msg = '消息文字f003文字f0...
  • wangyan_eden
  • wangyan_eden
  • 2013-07-12 16:04
  • 1314

手把手教你玩转QQ的原创表情

QQ的原创表情非常的可爱,做得比较精致,深受广大QQ用户的喜爱;但怎么将这些表情保存下来,好让我可以在别的地方用呢? 乖乖牛在线将从不同的视角,为你解析QQ原创表情的存储、互通、保护的机制;熟悉了这些后,你将不光能够将自己喜欢的原创表情保存下来;如果你有自己的产品,也可以轻松的让自己的产品支持QQ的...
  • TragicGuy
  • TragicGuy
  • 2015-10-23 13:58
  • 1275
    博客介绍

    前行中的小猪!


    博客主要包含了Qt学习的一些基础内容,欢迎大家一起交流、讨论。


    博客将会不断更新,更多精彩、好玩的内容等着你!


    文章中的大图被压缩可能不是很清晰,可以放大网页进行浏览

    Qt 分享交流

    Qt 学习、爱好者 欢迎一起交流!

    群号:311750285
    个人资料
    • 访问:211885次
    • 积分:3070
    • 等级:
    • 排名:第13484名
    • 原创:75篇
    • 转载:0篇
    • 译文:1篇
    • 评论:232条
    最新评论