半透明彈窗需要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)); // 調整邊框位置防止鋸齒
?? ?}
};