Qt绘制边框有阴影兼容性问题

在Qt开发过程中,有时候我们要显示一个有阴影的对话框,这时一般采用自定义实现,然而最近在开发时软件时,Win11上显示正常,Win10或其他Win11电脑显示不正常,存在兼容性问题吗?

下面是具体的源码

#ifndef POPUPPEPANEL_H
#define POPUPPEPANEL_H

#include <QWidget>


class QPushButton;


class PopupPanel : public QWidget
{
    Q_OBJECT
public:
    explicit PopupPanel(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent *event) override;

private:
    void initView();


private:
    QPushButton *m_btnAi{nullptr};
    QPushButton *m_btnDoc{nullptr};
    QPushButton *m_btnLink{nullptr};
    QPushButton *m_btnExcel{nullptr};

};

#endif // POPUPPEPANEL_H
#include "popuppanel.h"
#include <QPainter>
#include <QVBoxLayout>
#include <QSpacerItem>
#include <QtMath>
#include <QApplication>
#include <QDateTime>
#include <QPushButton>
#include <QPainterPath>

#define PRINTTIME QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz");


PopupPanel::PopupPanel(QWidget *parent) :
    QWidget(parent)
{
    setAttribute(Qt::WA_TranslucentBackground, true);
    initView();
}

void PopupPanel::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    //绘制阴影
    QPainter painter(this);
    QPainterPath path;
    path.setFillRule(Qt::WindingFill);
    path.addRoundedRect(5, 5, this->width() - 5 * 2, this->height() - 5 * 2, 3, 3);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.fillPath(path, QBrush(Qt::white));

    QColor color("#BBBBBB");
    for (int i = 0; i < 5; i++)
    {
        QPainterPath path;
        path.setFillRule(Qt::WindingFill);
        path.addRoundedRect(5 - i, 5 - i, this->width() - (5 - i) * 2, this->height() - (5 - i) * 2, 3 + i, 3 + i);
        color.setAlpha(80 - qSqrt(i) * 40);
        painter.setPen(color);
        painter.drawPath(path);
    }
}



void PopupPanel::initView()
{
    QVBoxLayout *vLayoutMain = new QVBoxLayout();
    vLayoutMain->setSpacing(12);//4
    vLayoutMain->setContentsMargins(5, 12, 5, 12);
    vLayoutMain->setObjectName(QString::fromUtf8("vLayoutMain"));

    QSize size(110, 28);
    m_btnAi = new QPushButton(this);
    m_btnAi->setMinimumSize(size);
    m_btnAi->setMaximumSize(size);

    m_btnDoc = new QPushButton(this);
    m_btnDoc->setMinimumSize(size);
    m_btnDoc->setMaximumSize(size);

    m_btnLink = new QPushButton(this);
    m_btnLink->setMinimumSize(size);
    m_btnLink->setMaximumSize(size);

    m_btnExcel = new QPushButton(this);
    m_btnExcel->setMinimumSize(size);
    m_btnExcel->setMaximumSize(size);

    vLayoutMain->addWidget(m_btnAi);
    vLayoutMain->addWidget(m_btnDoc);
    vLayoutMain->addWidget(m_btnLink);
    vLayoutMain->addWidget(m_btnExcel);
    this->setLayout(vLayoutMain);

    //灰底
    QString strButtonStyle = QString("QPushButton{background-color:transparent;border-radius:0px;"
                                "background-image: url(:/image/%1);background-origin:content;background-position:left;"
                                "background-repeat: no-repeat;text-align:center;padding-left:12px;border:none;}"
                                "QPushButton:hover{background-color:#F2F2F2;}"
                                "QPushButton:pressed{background-color:#D5E7FE;}"
                               );

    m_btnAi->setStyleSheet(strButtonStyle.arg("ai.png"));
    m_btnDoc->setStyleSheet(strButtonStyle.arg("ding_doc.png"));
    m_btnLink->setStyleSheet(strButtonStyle.arg("link.png"));
    m_btnExcel->setStyleSheet(strButtonStyle.arg("excel.png"));

    QFont font = qApp->font();
    font.setPixelSize(14);
    m_btnAi->setFont(font);
    m_btnDoc->setFont(font);
    m_btnLink->setFont(font);
    m_btnExcel->setFont(font);

    m_btnAi->setText("Ai");
    m_btnDoc->setText("Doc");
    m_btnLink->setText("Link");
    m_btnExcel->setText("Excel");
}



#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include "popuppanel.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
    void initData();

public slots:
    void slotShowDialog();

private:
    Ui::Dialog *ui;
    PopupPanel *m_popupPanel{nullptr};
};
#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    initData();
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::initData()
{
    QString strButtonStyle = QString("QPushButton{background-color:transparent;border-radius:0px;"
                                "background-image: url(:/image/show_move_control_normal.png);background-origin:content;background-position:left;"
                                "background-repeat: no-repeat;text-align:left;padding-left:12px;border:none;}"
                                "QPushButton:hover{background-color:#F2F2F2;background-image: url(:/image/show_move_control_hover.png);}"
                                "QPushButton:pressed{background-color:#D5E7FE;background-image: url(:/image/show_move_control_normal.png);}"
                               );

    //显示阴影对话框
    m_popupPanel = new PopupPanel(this);
    m_popupPanel->setObjectName(QString("m_popupPanel"));
    m_popupPanel->setMaximumSize(QSize(120, 150));
    m_popupPanel->setMinimumSize(QSize(120, 150));
    m_popupPanel->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);
    m_popupPanel->hide();
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(slotShowDialog()));
}

void Dialog::slotShowDialog()
{
    qDebug() << "slotShowDialog=============================" << ui->pushButton->pos();
    QPoint point = mapToGlobal(ui->pushButton->pos());
    qDebug() << "slotShowDialog======================point=======" << point;
    m_popupPanel->move(point.x() - 130, point.y() - 160);
    m_popupPanel->show();
    qDebug() << "slotShowDialog=============================" << m_popupPanel->pos();
}
#include "dialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFont defaultFont = qApp->font();
    defaultFont.setFamily("Microsoft YaHei");
    qApp->setFont(defaultFont);
    Dialog w;
    w.show();
    return a.exec();
}

运行点击Button按钮

这是在Win11上显示的效果

这是在Win10上显示的效果,很明显示,右边和底部有黑色线

同样一份代码为什么不同系统有不同效果呢?

原来有的系统是默认带了这个阴影效果,得把它去掉,即设置属性时,多加一个Qt::NoDropShadowWindowHint

在Dialog::initData()函数里,把

m_popupPanel->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);

改成

m_popupPanel->setWindowFlags(Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::Popup);

运行效果如下:

 现在在Win10上没有黑边效果了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/565967.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day_8题解

利用最大公约数求最小公倍数 #include<iostream> using namespace std;int gcd(int a,int b) {return b?gcd(b,a%b):a; }int main() {long long a,b;cin>>a>>b;long long ansgcd(a,b);cout<<(a*b)/ans<<endl;return 0; }排序遍历&#xff0c;记…

不安全软件,2024 年供应商该如何应对漏洞?

关键在于代码 使用专用工具和系统分析产品代码编写的各个阶段。 与安全研究人员合作 理想情况下&#xff0c;每个供应商都应该有自己持续的漏洞赏金计划&#xff0c;以测试基础设施、软件发布流程和最终产品。这将有助于在真正的攻击发生之前发现漏洞&#xff0c;保护客户。…

Mockito

小王学习录 依赖注解MockSpy静态方法单元测试InjectMocks 注解Captor 注解BeforeAll 和 BeforeEach的区别ParameterizedTestValueSourceEnumSourceCsvSourceMethodSource 打桩打桩方式打桩参数匹配方式 依赖 <!-- https://mvnrepository.com/artifact/org.mockito/mockito-i…

Django模型的属性与方法

本节介绍Django模型的属性和方法&#xff0c;以及如何重写之前定义的模型方法等内容。 3.5.1 模型属性 Django模型中最重要的属性就是Manager&#xff0c;它是Django模型和数据库查询操作之间的接口&#xff0c;并且被用作从数据库当中获取实例的途径。如果Django模型中没有…

探索大型语言模型(LLM)在人类性格个性评估(MBTI)中的前景与应用

1.概述 大型语言模型&#xff08;LLM&#xff09;如ChatGPT在各个领域的应用确实越来越广泛&#xff0c;它们利用庞大的数据集进行训练&#xff0c;以模拟人类的语言理解和生成能力。这些模型在提供信息、解答问题、辅助决策等方面表现出了强大的能力&#xff0c;但它们并不具…

微电子领域常见概念(六)化学键合

微电子领域常见概念&#xff08;六&#xff09;化学键合 化学键合是化学中一个非常基础且重要的概念&#xff0c;它描述了原子之间通过电子的相互作用形成的连接。可以进行以下分类&#xff1a; 1. 离子键合&#xff08;Ionic Bonding&#xff09; • 定义&#xff1a;离子键合…

如何查看自己的公网IP?

我们在网络中&#xff0c;每一个设备都被分配了一个唯一的IP地址&#xff0c;用以区分和识别其他设备。公网IP地址是指可被公众访问的IP&#xff0c;是因特网上的全球唯一标识。当我们需要查看自己的公网IP时&#xff0c;可以采取以下几种方式。 使用命令行查看公网IP 在Windo…

书生·浦语大模型实战训练营--第二期第七节--OpenCompass大模型评测实战--homework

一、配置环境 安装下面的顺序以及自己的文件路径配置环境 conda create -n opencompass python3.10 -y 安装下面的包 absl-py accelerate>0.19.0 boto3 cn2an cpm_kernels datasets>2.12.0 einops0.5.0 evaluate>0.3.0 fairscale func_timeout fuzzywuzzy immutab…

Linux 系统IO函数之stat、lstat函数

1、stat函数 要点&#xff1a; int stat(const char *pathname, struct stat *statbuf); 作用&#xff1a;查看文件的信息 man 2 stat/return value1、stat结构体&#xff1a; 2、sturct stat 结构体中 st_mode 的含义&#xff08;文件的类型和存取的权限&#xff09;: st_mo…

zabbix“专家坐诊”第237期问答

问题一 Q&#xff1a;在一台虚拟机安装了mysql数据库服务器上安装了agent&#xff0c;将MySQL by Zabbix agent模板联接上去了&#xff0c;但增加的mysql监控项&#xff0c;全部显示为不支持的&#xff0c;这是什么原因&#xff1f; A&#xff1a;这个是自定义脚本的形式&#…

IBM SPSS Statistics for Mac:强大的数据分析软件

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件&#xff0c;专为Mac用户设计&#xff0c;提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生&#xff0c;都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…

【UI】element-ui的el-dialog的遮罩层在模态框的前面bug

最近在写element ui 的时候使用dialog组件&#xff0c;偶然出现了这种情况 原因&#xff1a; 是因为遮罩层插入进了body标签下&#xff0c;z-index高于当前父元素。 解决&#xff1a;在el-dialog标签里加上:modal-append-to-body"false"就可以了。 饿了么官网文档&a…

熊猫电竞赏金赛系统源码 APP+H5双端源码附搭建教程下载

熊猫电竞赏金系统简介 熊猫电竞赏金电竞系统 赏金赛源码&#xff0c;用户通过平台打比赛&#xff0c;赢了获得奖金奖励&#xff0c; 金币赛、赏金赛、vip赛等种赛事 可开王者荣耀、和平精英比赛 支持1v1、单排、双排组、战队排等多种比赛模式 支持QQ区、微信区 游戏玩的好…

大语言模型(LLM)漏洞爆发,AI模型无一幸免

本文概述了人工智能初创公司Anthropic于2024年04月03日发表的一篇针对人工智能安全的论文&#xff0c;该公司在本论文中宣布的一种新的“越狱”技术&#xff0c;名为Many-shot Jailbreaking&#xff08;多轮越狱&#xff09;。文章详细描述了目前大语言模型&#xff08;LLM&…

iOS 在OC旧项目中使用Swift进行混编

iOS 在OC旧项目中使用Swift进行混编 1、创建桥接文件 ​ 第一次在Swift创建OC文件&#xff0c;或者第一次OC创建Swift时&#xff0c;xcode会提示桥接&#xff0c;Creat Bridging Header即可,这个文件用于Swift调用OC文件&#xff0c;与OC调用Swift无关。 2、在TARGETS中设置D…

深入docker-swarm overlay网络模型

目录 1.简介 2.网络模型 3.docker_gwbridge网络 3.1.docker_gwbridge网关地址 3.2.检查docker_gwbridge网络 3.2.1.查找任务容器eth接口 3.2.2.查找ingress-sbox容器eth接口 4.检查ingress网络 4.1.检查ingress网络 4.2.检查ingress网络的命名空间 4.2.1.查找任务容…

LLM学习之自然语言处理简单叙述

自然语言处理基础 自然语言处理&#xff1a;让计算机读懂人所写好的这些文本&#xff0c;能够像人一样进行交互。 自然语言处理的任务和应用 任务&#xff1a; 词性标注 part of speech tagging 动词&#xff0c;名词&#xff0c;形容词&#xff1f; 命名实体的识别 name…

iOS OC项目中引入SwiftUI文件

iOS OC项目中引入SwiftUI文件 1、创建SwiftUI文件 2、第一次创建时&#xff0c;Xcode会提示桥接&#xff0c;选择 Creat Bridging Header即可。 3、创建swift管理类 /**在UIKit中使用SwiftUI&#xff0c;需要使用UIHostingController对SwiftUI进行包装&#xff0c;返回的是U…

uniapp自定义顶部导航栏

首先uniapp获取设备信息&#xff1a;uni.getSystemInfo或uni.getSystemInfoSync&#xff0c;可用于设置顶部安全区 留一个设备安全区的位置哦 然后在pages.json文件里配置自定义导航栏 {"pages": [ //pages数组中第一项表示应用启动页&#xff0c;参考&#xff1a…

用友U8-Cloud api/hr接口存在SQL注入漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 U8 Cloud是由用友推出的新一代云ERP系统&#xff0…