Qt源码分享(四)--自定义标签,源码分享

Qt源码分享(四)–自定义标签,源码分享

由于最近的疫情的影响,导致公司走了一部分人。又是项目的重新启动,导致我没有时间写文章了。分享一些自定义控件,是从公司的项目中抠出来的。

Qt源码分享(四)--自定义标签,源码分享_第1张图片

关注微信号:cpp手艺人,获取源码

好,废话不说,先看看效果怎么样。

1.自绘制图片
2.大小自适应

注意:这个demo只是演示使用的,里面的一些内存还没有释放,如果你要套用一定要注意内存问题,因为一些内存问题的释放和业务有关系,这里我就做下演示。

Qt源码分享(四)--自定义标签,源码分享_第2张图片

这里我贴出主要的代码:

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);
}

你可能感兴趣的:(Qt源码分享)