用Qt实现类似QQ表情窗口

演示

实现起来比较简单,就是在每个TableWidget的单元格设置一个Widget,如Label.重写QLabel类中的两个函数,达到鼠标进入离开单元格时显示的效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//添加gif到TabWidget
void Widget::addGIFtoTableWidget(int row,int column,QString file){
//自定义类,用来重新实现了一些函数
MyLabel *label=new MyLabel;
//设置边距
label->setMargin(3);
//gif动画
QMovie *movie=new QMovie;

movie->setFileName(file);
movie->setScaledSize(QSize(24,24));
movie->start();
movie->stop();
label->setMovie(movie);
//添加部件到tableWidget
ui->tableWidget->setCellWidget(row,column,label);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#define QQ_GIF_DIR "../expression/qq/"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//不可选
ui->tableWidget->setSelectionMode(QTableWidget::NoSelection);
ui->tableWidget->setRowCount(10);
//初始化 gif表格
int num_index=1;
int rowCount= ui->tableWidget->rowCount();
int columnCount = ui->tableWidget->columnCount();
for (int row = 0; row <rowCount; ++row)
{
for (int column = 0;column<columnCount; ++column)
{
QString strFileName=QString("%1%2.gif").arg(QQ_GIF_DIR).arg(num_index);
//gif文件是否存在
if(QFileInfo(strFileName).exists())
addGIFtoTableWidget(row,column,strFileName);
num_index++;
}
}
}

然后再看看 MyLabel 类

1
2
3
4
5
6
7
8
9
10
11
12
13
mylabel.h
#ifndef MYLABEL_H
#define MYLABEL_H
#include<QLabel>
class MyLabel : public QLabel
{
public:
MyLabel(QWidget *parent=0);
protected:
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);
};
#endif // MYLABEL_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mylabel.cpp
#include "mylabel.h"
#include<QMovie>
MyLabel::MyLabel(QWidget *parent):QLabel(parent)
{
}
void MyLabel::enterEvent(QEvent *event)
{
setStyleSheet("border: 1px solid rgb(111, 156, 207);background-color:rgba(150,150,150,50)");
setCursor(Qt::PointingHandCursor);
QMovie *movie=this->movie();
//开始播放
movie->start();
}
void MyLabel::leaveEvent(QEvent *event)
{
setStyleSheet("border:none");
setCursor(Qt::ArrowCursor);
QMovie *movie=this->movie();
//跳转到动态图的初始帧
movie->jumpToFrame(0);
//停止
movie->stop();
}

我在Ui窗口添加了了一个table widget部件,所以还要先设置相应的参数
img

OK,的确挺简单的…当然还有很多问题也要考虑…