Qt源码分享(四)–自定义标签,源码分享
由于最近的疫情的影响,导致公司走了一部分人。又是项目的重新启动,导致我没有时间写文章了。分享一些自定义控件,是从公司的项目中抠出来的。
关注微信号:cpp手艺人,获取源码
好,废话不说,先看看效果怎么样。
1.自绘制图片
2.大小自适应
注意:这个demo只是演示使用的,里面的一些内存还没有释放,如果你要套用一定要注意内存问题,因为一些内存问题的释放和业务有关系,这里我就做下演示。
这里我贴出主要的代码:
void TabButton::Resize(const QSize &size)
{
int adapt_width = std::max<int>(std::min<int>(
sMAX_WIDTH, size.width()),
sMIN_WIDTH);
this->setFixedSize(QSize(adapt_width, size.height()));
const int kbtn_close_with = kBTN_CLOSE_WIDTH;
mBtnCloseRect.setLeft(adapt_width-kbtn_close_with-kBTN_CLOSE_DISTANCE);
mBtnCloseRect.setWidth(kbtn_close_with);
mWebsiteRect.setLeft(10/200.0*adapt_width);
mWebsiteRect.setWidth(kbtn_close_with);
double width_distance = 32;
mTextRectF = QRectF(width_distance, 0, adapt_width-width_distance-9-kbtn_close_with, size.height());
update();
}
void TabButton::SetDelete(bool isDelete)
{
mDelete = isDelete;
}
bool TabButton::GetDelete() const
{
return mDelete;
}
void TabButton::SetShowIndex(int index)
{
mShowIndex = index;
}
int TabButton::GetShowIndex() const
{
return mShowIndex;
}
int TabButton::GetID() const
{
return mID;
}
bool TabButton::operator==(const TabButton &tabButton)
{
return this->mID == tabButton.mID;
}
void TabButton::paintEvent(QPaintEvent *paintEvent)
{
QPainter painter(this);
QRect rect = this->rect();
rect.setHeight(this->size().height());
QPixmap *bk_pixmap = mStatusMap[mPushStatus];
// 0.画出icon
mWebsiteIcon.paint(&painter, mWebsiteRect);
// 1.画出背景
painter.drawPixmap(rect, *bk_pixmap);
// 2.画出文字
if (! mTitle.isEmpty()) {
QString draw_text = getElidedText(mFont, mTitle, mTextRectF.width());
painter.setFont(mFont);
painter.setPen(mPushStatus == PushStatus::Press ? mHighTextColor : mNormalTextColor);
painter.drawText(mTextRectF, draw_text, QTextOption(Qt::AlignVCenter | Qt::AlignLeft));
}
// 3.画出关闭按钮
{
painter.drawPixmap(mBtnCloseRect, mCloseBtnIsHover ? mHoverBtnClose : mNormalBtnClose);
}
// 4.是否需要绘制分割线
if (mPushStatus == PushStatus::Normal || mPushStatus == PushStatus::Leave) {
painter.setPen(QColor(0, 0, 0, 30));
int start_height = (rect.height()-kLINE_HEIGHT)/2;
painter.drawLine(rect.width()-1, start_height, rect.width()-1, start_height+kLINE_HEIGHT);
}
}
void TabButton::mousePressEvent(QMouseEvent *mouseEvent)
{
mPushStatus = PushStatus::Press;
}
void TabButton::mouseReleaseEvent(QMouseEvent *mouseEvent)
{
if (mBtnCloseRect.contains(mouseEvent->pos())) {
emit OnClose(this);
} else {
emit OnClick(this);
}
QPushButton::mouseReleaseEvent(mouseEvent);
}
void TabButton::mouseMoveEvent(QMouseEvent *mouseEvent)
{
if (mBtnCloseRect.contains(mouseEvent->pos())) {
if (! mCloseBtnIsHover) {
mCloseBtnIsHover = true;
update();
}
} else {
if (mCloseBtnIsHover) {
mCloseBtnIsHover = false;
update();
}
}
QPushButton::mouseMoveEvent(mouseEvent);
}