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

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

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

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

image

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

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

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

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

image

这里我贴出主要的代码:

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

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 635672377@qq.com

文章标题:Qt源码分享(四)--自定义标签,源码分享

文章字数:481

本文作者:刘世雄

发布时间:2020-06-03, 17:20:39

最后更新:2020-06-03, 09:22:25

原始链接:http://lsxcpp.com/2020/06/04/Qt%E6%BA%90%E7%A0%81%E5%88%86%E4%BA%AB%EF%BC%88%E5%9B%9B%EF%BC%89-%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%87%E7%AD%BE%EF%BC%8C%E6%BA%90%E7%A0%81%E5%88%86%E4%BA%AB/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录