Qt实现不规则窗体--升级版

探讨了在Qt中创建不规则窗体的方法,包括使用遮罩和双缓冲绘图原理,以及如何通过设置窗体透明度实现更加灵活的绘图效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行效果

在这里插入图片描述
在这里插入图片描述

基于Qt实现不规则窗体,网上的教程千篇一律都是使用遮罩实现的,就像下面这样:

m_Pixmap.load("delete.png");    
resize( m_Pixmap.size() );         
setMask( m_Pixmap.mask() );

虽然这样做确实可以实现不规则窗体,但是我想自己通过绘图事件来绘制不规则窗体,而不是使用图片,这样自由度就大一些,就可以更快乐的玩耍了,所以我想借鉴双缓冲绘图原理,先在QPixmap上绘制,然后再将QPixmap绘制到窗体上,再设置遮罩,就像这样:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    pixmap = new QPixmap(200,200);
    paint();
    QBitmap bitmap = pixmap->mask();
    setMask(bitmap);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawPixmap(100,100,*pixmap);
}
void MainWindow::paint()
{
    QPainter painter(pixmap);
    painter.setPen(QColor(255,0,0));
    painter.drawEllipse(0,0,200,200);
}

但是一运行,根本没什么用,我功力尚浅,不知道在哪个环节出了问题,希望有知道的大佬指出来,让我也学习学习!

通过查阅得知了一种新的办法:将窗体设置为透明,但是控件不受影响,主要是添加如下代码:

setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);

这里使用了setAttribute()函数指定窗口的Qt::WA_TranslucentBackground属性,它可以使窗体背景透明,而其中的部件不受影响。不过在Windows下,还要使用setWindowFlags()函数指定Qt::FramelessWindowHint标志,这样才能实现透明效果。

其它的就照常绘图就完事了,加上上面那两行代码就行!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贝勒里恩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值