Qt工作笔记-设置窗体底纹以及控件透明度

583 篇文章 127 订阅
388 篇文章 20 订阅

目录

 

原理

关键代码


 

原理

在Web界面里面,可以看到,web前端程序员喜欢用一些淡淡的底纹(非背景),在此我也想实现下CS模型里面,Qt实现底纹功能!

程序运行截图如下:

底纹是这样的!

这里来展示一下动态图:

 

这里的原理如下:

重写这个painterEvent这个函数,实时获取窗体长和宽,并且是向上取整!然后再依次画图,是不是很简单的思路:

    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;

这里是说明一点:

void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;

是在事件循环中的(估计最后调用了Windows消息机制(Windows端)),他可以手动触发,也可以被动触发!

但在拖动窗体大小前:

    void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;

这个函数是会被提取触发的!

 

下面说一下第二个知识点,如何设置控件的透明度!

这里有一个函数是setWindowOpacity(),这函数是设置窗体透明度,学Qt的都知道,控件都是窗体,理论上是有效果的,但设置这个并没有什么用,因为Qt有个继承树机制,他的透明度由他父类决定,所以设置这个是然并卵!

但可以采用QSS进行设置,颜色有rgba,通过设置α通道即可:

background-color:rgba(255, 255, 255, 150)

 

 

关键代码

QSS

QTreeView{
	background-color:rgba(255, 255, 255, 150)
}

QPushButton{
	background-color:rgba(255, 255, 255, 150)
}

QLineEdit{
	background-color:rgba(255, 255, 255, 150)
}

关键的三个函数:

void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;
void setShadingNum();
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
void MainWindow::setShadingNum()
{
    m_shadingWidthNum = qCeil(width() / (float)QPixmap(":/img/shading.png").width());
    m_shadingHeightNum = qCeil(height() / (float)QPixmap(":/img/shading.png").height());

}
void MainWindow::resizeEvent(QResizeEvent *event)
{
    setShadingNum();
    QMainWindow::resizeEvent(event);
}
void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(QBrush(Qt::white));

    //set Shading
    QPixmap pixmap(":/img/shading.png");
    int startDrawX = 0;
    int startDrawY = 0;
    painter.setPen(Qt::black);
    QRect rect = this->rect();
    rect.setWidth(rect.width() - 1);
    rect.setHeight(rect.height() - 1);
    painter.drawRoundedRect(rect, 30, 30);

    painter.setPen(Qt::red);
    painter.drawPixmap(rect.width() - LABLESIZE16, rect.height() - LABLESIZE16
                       , QPixmap(":/img/dot_blue.png").scaled(LABLESIZE16, LABLESIZE16));

    for(int i = 0; i < m_shadingHeightNum; i++){

        for(int j = 0; j < m_shadingWidthNum; j++){

            painter.drawPixmap(startDrawX, startDrawY, pixmap);
            startDrawX += pixmap.width();
        }

        startDrawX = 0;
        startDrawY += pixmap.height();
    }

    QMainWindow::paintEvent(event);
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值