注意: 以下几种方法, 在没有父窗口情况下, 鼠标热点范围和非透明范围一致; 在有父窗口情况下,鼠标热点范围仍然为矩形; 如果想改变鼠标的热点范围,见https://blog.youkuaiyun.com/qq_33259248/article/details/128222959
- 方法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
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
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 只针对按钮 , 根据现有的图片绘制
:/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);"); }
无父窗口效果
, 有父窗口效果