半透明弹窗需要paintEvent()接口支持
方法一:使用setStyleSheet设置半透明样式,如果是子窗口,则可注释构建函数内属性设置
class TranslucentWidget : public QWidget {
public:
explicit TranslucentWidget(QWidget *parent = nullptr) : QWidget(parent) {
setObjectName("TranslucentWidget");
//只设置Qt::FramelessWindowHint和WA_TranslucentBackground,半透明背景默认会鼠标穿透,即使WA_TransparentForMouseEvents置为false也一样穿透;但追加设置Qt::Tool后,鼠标不穿透
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
//必须设置这个属性,才能支持透明背景
setAttribute(Qt::WA_TranslucentBackground);
}
protected:
void paintEvent(QPaintEvent *event)
{
__super::paintEvent(event);
QStyleOption opt;
opt.init(this);
QPainter paint(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &paint, this);
}
};
使用示例:
TranslucentWidget* floatWindow = new TranslucentWidget(this);
floatWindow ->setStyleSheet("QWidget#TranslucentWidget{background:rgba(100, 0, 0, 100);border:2px solid red;}");
floatWindow ->resize(QSize(500, 400));
floatWindow ->move(QPoint(0, 0));
floatWindow ->show();
floatWindow ->raise();
方法二:
class TranslucentWidget : public QWidget {
public:
explicit TranslucentWidget(QWidget *parent = nullptr) : QWidget(parent) {
setObjectName("TranslucentWidget");
//只设置Qt::FramelessWindowHint和WA_TranslucentBackground,半透明背景默认会鼠标穿透,即使WA_TransparentForMouseEvents置为false也一样穿透;但追加设置Qt::Tool后,鼠标不穿透
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
// 必须设置这个属性,才能支持透明背景
setAttribute(Qt::WA_TranslucentBackground);
}
protected:
void paintEvent(QPaintEvent *) override {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制一个半透明的红色背景
painter.fillRect(rect(), QColor(100, 0, 0, 100));
// 可选:绘制边框
painter.setPen(QPen(Qt::red, 2));
painter.drawRect(rect().adjusted(0, 0, -1, -1)); // 调整边框位置防止锯齿
}
};