Qt 窗口(控件)圆角或其他形状

注意: 以下几种方法, 在没有父窗口情况下, 鼠标热点范围和非透明范围一致; 在有父窗口情况下,鼠标热点范围仍然为矩形;  如果想改变鼠标的热点范围,见https://blog.csdn.net/qq_33259248/article/details/128222959

  1.  方法1
    MyWidget::MyWidget(QWidget *parent):
        QWidget(parent)
    {
        setWindowFlags(Qt::FramelessWindowHint);
        setAttribute(Qt::WA_TranslucentBackground);
        setFixedSize(100, 100);
    }
    
    void MyWidget::paintEvent(QPaintEvent *event)
    {
        QPainter p(this);
        p.setRenderHint(QPainter::Antialiasing);
        p.setPen(Qt::NoPen);
        p.setBrush(Qt::red);
        p.drawRoundedRect(this->rect(), 25, 25);
    }
    
    
    
      无父窗口效果, 有父窗口效果
  2. 方法2
    MyWidget::MyWidget(QWidget *parent):
        QWidget(parent)
    {
        setWindowFlags(Qt::FramelessWindowHint);
        setAttribute(Qt::WA_TranslucentBackground);
        setFixedSize(100, 100);
        this->setStyleSheet("background-color: #FF0000; border: 0px solid rgba(255,255,255,1);border-radius:25px;}");
    }
    
    void MyWidget::paintEvent(QPaintEvent *event)
    {
        QStyleOption opt;
        opt.initFrom(this);
        QPainter p(this);
        style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
    }
    
    
    

    无父窗口效果, 有父窗口效果

  3.  方法3 

    MyWidget::MyWidget(QWidget *parent):
        QWidget(parent)
    {
        setWindowFlags(Qt::FramelessWindowHint);
        setAttribute(Qt::WA_TranslucentBackground);
        setFixedSize(400, 400);
    }
    
    void MyWidget::paintEvent(QPaintEvent *)
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        QBrush brush(QColor(0, 0, 255), Qt::SolidPattern);
        painter.setBrush(brush);
    
        QPainterPath path;
        path.moveTo(100, 100);
        path.lineTo(130, 100);
        path.lineTo(140, 90);
        path.lineTo(150, 100);
        path.lineTo(200, 100);
        path.arcTo(150, 150, 50, 50,  0.0f,  -90.0f);
        path.lineTo(100, 200);
        path.closeSubpath();
    
        QFont myFont;
        myFont.setPixelSize(12);
        QPointF baseline(120, 120);
        path.addText(baseline, myFont, tr("Qt"));
    
        QPen pen;
        painter.setPen(Qt::NoPen);
        painter.drawPath(path);
    }
    

     无父窗口效果, 有父窗口效果

  4. 方法4  只针对按钮 , 根据现有的图片绘制

    :/view/view/doing1.png

     

    MyWidget::MyWidget(QWidget *parent):
        QPushButton(parent)
    {
        setWindowFlags(Qt::FramelessWindowHint);
        setAttribute(Qt::WA_TranslucentBackground);
    
        QPixmap aaa(":/view/view/doing1.png");
        setFixedSize(aaa.size());
    
        setStyleSheet(" border-image:url(:/view/view/doing1.png);");
    }
    
    
    
    

       无父窗口效果, 有父窗口效果

     

     

     

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值