Qt透明无边框窗口以及拖动

窗口透明

 窗口整体透明(包含其子空控件)

//窗口以及子控件都透明
//setAttribute(Qt::WA_WState_WindowOpacitySet);
//网上说直接设置不起作用,需要加这个属性,但是我测试直接使用下面函数没问题
setWindowOpacity(0.7);

窗口半透明+paintEvent方式

  • 窗体透明设置

设置窗口全透明,需要setWindowFlags不然会有黑色底色

/*全透明窗口,子控件不透明*/

setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
//设置背景色透明(透明的部分,鼠标点击,鼠标信号会透传到z轴底层去)
setAttribute(Qt::WA_TranslucentBackground,true);
  •  在paintEvent中绘制Rect(我绘制的是圆角矩形)
void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter p(this);             // 创建QPainter一个对象

    p.setRenderHint(QPainter::Antialiasing);
    p.setBrush(QBrush(QColor(97,111,118,150)));
    p.setPen(Qt::transparent);
    QRect rect = this->rect();
    p.drawRoundedRect(rect,15,15);
    QWidget::paintEvent(event);

}

 可以看到这种方式Button子空间并没有透明,如果需要子控件也透明需要在第一部分代码之后调用setWindowOpacity设置透明度,然后paintEvent中的QBrush不设置透明度

样式表实现半透明

直接上代码吧,懒得打字了

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground,true);

    setStyleSheet("border:none; background-color:rgba(0,0,255,150)");
}

void MainWindow::paintEvent(QPaintEvent * event)
{
    Q_UNUSED(event);
    QStyleOption StyleOpt;
    StyleOpt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget,&StyleOpt,&p,this);
}

无边框窗口的移动问题

如果我们将窗口设置为无边框之后(透明第二部分,Qt::FramelessWindowHint)那么我们的窗口是无法使用鼠标拖动的,就像上面的第二个圆角巨型窗口,解决方式也很简单,重写mouseevent相关函数就可以了

virtual void mousePressEvent(QMouseEvent * event) override;
virtual void mouseMoveEvent(QMouseEvent * event) override;
virtual void mouseReleaseEvent(QMouseEvent * event) override;


void MainWindow::mousePressEvent(QMouseEvent *event)
{
    QMainWindow::mousePressEvent(event);
    if(nullptr == event)
        return ;
    if(event->button() == Qt::LeftButton)
    {
        isDragging = true;
        mouse_startPoint = event->globalPos() ;
        window_top_left_point = this->frameGeometry().topLeft();
    }
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    QMainWindow::mouseMoveEvent(event);
    if(nullptr == event)
    {
        return ;
    }
    if(isDragging)
    {
        QPoint distence = event->globalPos() - mouse_startPoint;
        this->move(window_top_left_point + distence);
    }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    QMainWindow::mouseReleaseEvent(event);
    if(nullptr == event)
        return;
    if(event->button() == Qt::LeftButton)
        isDragging = false ;
}

实际应用

有了以上趁热打铁用的使用的东西练练手,不得不说不对比以前用VC++做异形窗口的时候,步骤是多么繁琐QT,做界面就是方便快捷

异形窗口 (并非真正的异形窗口)

 这是主窗口的函数,bgPix是一个QPixMap类型,用来绘制图片,首先设置了窗口的大小,然后设置窗口透明属性

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setFixedSize(626,626);
    this->setWindowFlag(Qt::FramelessWindowHint);
    this->setAttribute(Qt::WA_TranslucentBackground);
    bgPix.load("://Resource/background.png");
    bgPix = bgPix.scaled(size());
}

以上代码,设置窗口大小,bgpix加载图片资源,然后调用scaled函数缩放到窗体大小

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter p(this);
    p.drawPixmap(0,0,bgPix);
}
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值