先看效果图: 实现的功能:
- 用户可以动态添加按钮;
- 按钮在鼠标的移动、点击时按钮有立体的效果展示;
- 双击鼠标左键可以修改按钮的文字;
- 点击按钮右上角的关闭按钮可以直接删除当前按钮。
定义按钮的各种状态下的颜色
#pragma once
#include <QColor>
#include <QWidget>
//基类
class BaseTabBarBtn: public QWidget {
Q_OBJECT
public:
BaseTabBarBtn(QWidget *parent = Q_NULLPTR);
~BaseTabBarBtn();
//获取当前标签页的索引值
int getTabBarBntIndex() {
return _index;
}
signals:
void sigBtnClicked(QWidget* wgt);
protected:
int _index = -1;//从0开始 -1表示当前为添加按钮
bool _leftButtonPress = false;//左键按下
bool _mouseOn = false;//鼠标在界面上
QColor _startColor = QColor(217, 237, 253);//按钮渐变色中的开始颜色
QColor _endColor = QColor(193, 223, 246);//按钮渐变色中的结束颜色
QColor _graphicColor = QColor(68, 101, 151);//绘制的图形的颜色
};
#include <QMouseEvent>
#include "BaseTabBarBtn.h"
BaseTabBarBtn::BaseTabBarBtn(QWidget *parent):QWidget(parent) {
}
BaseTabBarBtn::~BaseTabBarBtn() {
}
如果处理按钮的双击事件和单击事件,会引起冲突:所以使用标志来控制
int _clickCount = 0;//点击次数
_clickTimer = new QTimer;
connect(_clickTimer, SIGNAL(timeout()), this, SLOT(slotClickTime()));
void TabBarBtn::mousePressEvent(QMouseEvent *e) {
if (e->button() & Qt::LeftButton) {
qDebug() << "mousePressEvent";
_clickTimer->start(300);
if (!_rectCloseBtn.contains(e->pos())){
_leftButtonPress = true;
_clickCount++;
} else {//点击关闭按钮
_parentWgt->closeBtn(this);
}
this->update();
}
}
void TabBarBtn::mouseDoubleClickEvent(QMouseEvent*e) {
if (e->button() == Qt::LeftButton) {//左键双击
_lineEdit->setText(_text);
_lineEdit->setFocus();
_lineEdit->show();
_clickCount++;
qDebug() << "mouseDoubleClickEvent";
}
}
void TabBarBtn::slotClickTime() {
_clickTimer->stop();
qDebug() << _clickCount;
if (_clickCount == 1){//只点击了一次
emit sigBtnClicked(this);
}else if (_clickCount == 2){//双击鼠标
}
_clickCount = 0;
update();
}
若有需要源码,请私信我!