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);//4vLayoutMain->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_NAMESPACEclass Dialog : public QDialog
{Q_OBJECTpublic: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上没有黑边效果了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PhpStorm的环境配置与应用的简单介绍】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Hive架构原理

Hive Hive 的架构是设计用于在大数据环境下进行数据仓库操作和分析的系统。它建立在 Hadoop 生态系统之上&#xff0c;利用 Hadoop 的存储&#xff08;HDFS&#xff09;和计算&#xff08;MapReduce、Tez、Spark 等&#xff09;能力。 1. 元数据存储&#xff08;Metastore&am…

Flutter开发之--初识Flutter

文章目录 概述Flutter整体架构嵌入层引擎层框架层 跑通demo尝鲜Flutter项目的目录介绍Flutter demo项目的运行 总结 概述 Flutter 是由Google公司研发的一种跨端开发技术&#xff0c;在2018年正式推出。Flutter自带Skia图形绘制引擎&#xff0c;采用自绘制的方式&#xff0c;不…

【Hadoop3.3.6】数据块副本放置策略及解析EditLog和FsImage

目录 一、摘要二、正文2.1 环境说明2.2 网络拓扑2.3 Hadoop副本放置策略介绍2.4 解析EditLog和Fsimage镜像文件三、小结一、摘要 通过解析存储于NameNode节点上的日志文件EditLog和镜像文件(元数据)Fsimage来反向验证HDFS的数据块副本存放策略,其目的是希望加深对Hadoop的数…

Tensorflow AutoGraph 的作用和功能

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ TensorFlow AutoGraph 是 TensorFlow 中的一个重要特性&#xff0c;它允许开发者使用普通的 Python 语法编写高效的 TensorFlow 图&#xff08;graph&#xff09;。这意味着开发者可以利用 Python 的易…

【电机控制】滑模观测器PMSM无感控制波形图

【电机控制】滑模观测器PMSM无感控制波形图 文章目录 前言一、FOC控制1.三相电流2.Clark变换静止坐标系iαiβ3.park变换旋转坐标系idiq4.电流环PI控制输出UdUq5.UdUq 反park变换UαUβ 二、反电动势观测器BEMF1.静止坐标系iαiβ提取反电动势EaEb2.反电动势EaEb提取位置信息、…

物联网通信中NB-IoT、Cat.1、Cat.M该如何选择?

物联网通信中NB-IoT、Cat.1、Cat.M该如何选择? 参考链接:物联网通信中NB-IoT、Cat.1、Cat.M该如何选择?​​ 在我们准备设计用于大规模联网的物联网设备时,选择到适合的LTE IoT标准将是我们遇到的难点。这是我们一开始设计产品方案就需要解决的一个问题,其决定我们设备需…

前端框架技术调研

目前程序员使用前端框架最多的是哪一个&#xff1f;

3D MINS 多模态影像导航系统

3D MINS多模态影像导航系统&#xff08;Multimodal Image Navigation System&#xff09;是SunyaTech研发的建立在DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;图像基础之上的多模态影像导航系统&#xff0c;集二维影像PACS管理、三维影像层级…

vscode ssh远程连接服务器,一直正在下载vscode服务器的解决办法

前言 为方便描述&#xff0c;在本教程中&#xff0c;发起远程连接的叫“主机”&#xff0c;被远程连接的叫“服务器”。 正文 如果主机是首次用vscode远程连接服务器&#xff0c;会在服务器上自动下载vscode服务器&#xff0c;但有时候因为网络问题&#xff0c;会卡在&#xff…

STL Array、ForwardList源码剖析

STL Array、ForwardList源码剖析 参考文章: https://blog.csdn.net/weixin_45389639/article/details/121618243 array 源代码 template<typename _Tp,std::size_t _Nm> struct array {typedef _Tp value_type;typedef _Tp* pointer;typedef value_type* iterator;// Su…

【函数式接口使用✈️✈️】配合策略模式实现文件处理的案例

目录 &#x1f378;前言 &#x1f37b;一、功能描述 &#x1f37a;二、面向对象设计模式 &#x1f379;三、策略模式 &#x1f366;四、策略 VS 面向对象 &#x1f368;章末 &#x1f378;前言 小伙伴们大家好&#xff0c;上周初步了解了下函数式接口&#xff0c;Consume…

Azure AD统一认证及用户数据同步开发指导

本文主要目的为&#xff1a;指导开发者进行自有服务与Azure AD统一认证的集成&#xff0c;以及阐述云端用户数据同步的实现方案。本文除了会介绍必要的概念、原理、流程外&#xff0c;还会包含Azure门户设置说明&#xff0c;以及使用Fiddler进行全流程的实操验证&#xff0c;同…

HarmonyOS ArkUI实战开发-页面跳转(Router、Ability)

页面跳转可以分为页面内跳转和页面间跳转&#xff0c;页面内跳转是指所跳转的页面在同一个 Ability 内部&#xff0c;它们之间的跳转可以使用 Router 或者 Navigator 的方式&#xff1b;页面间跳转是指所跳转的页面属与不同的 Ability &#xff0c;这种跳转需要借助 featureAbi…

Java练习题

打印9*9乘法口诀表 解析&#xff1a;利用for循环解决 代码如图所示&#xff1a; public class Cc {public static void main(String[] args) {for (int i 1; i < 10; i){ //从1遍历到9 for(int j 1; j < i; j){ System.out.print(j "*" i "&…

Docker pull镜像名称 把本地镜像推送到远程详解

Docker pull镜像名称 把本地镜像推送到远程详解&#xff1a; Docker 镜像 仓库 容器介绍 以及镜像仓库详解 下载一个alpine的镜像演示&#xff0c;alpine是一个比较小的的linux镜像。 docker pull alpinedocker tag d4ff818577bc docker.io/itying/alpine:v1.0.1docker tag d4…

【CSS】使用 scroll snap 实现页面的垂直大屏滚动

CSS 属性 scroll-snap-type 设置了在有滚动容器的情形下吸附至吸附点的严格程度。 scroll-snap-type 使用 scroll snap 也可以用于垂直滚动&#xff0c;全屏展示就是一个很好的例子: <main><section class"section section-1"></section><sect…

Android驱动开发之如何编译和更换内核

编译内核可以使用图形化的界面配置,也可以直接使用脚本。在X86_64模拟器环境下,不用交叉编译,而交叉编译工具很容易出现兼容问题,一般也只能使用芯片厂商提供的工具,而不是GNU提供的工具。 android内核开发流程以及架构变化了很多,详情请看 内核官网 内核版本选择 由…

keil把c语言函数转成汇编

汇编可以让开发人员从根源上理解程序的运行逻辑&#xff0c;本文介绍如何在keil环境下如何把一个c文件中的某一个函数&#xff0c;转换为汇编函数&#xff0c;并编译运行。 右击某个c文件&#xff0c;选择Option for File。。。 图1 然后把下图中的Generate Assembler SRC Fi…

DDP、pytorch的分布式 torch.distributed.launch 训练说明

0、DDP的运行原理 执行步骤&#xff1a; 将data分为多个不同的batch&#xff0c;每个gpu得到batch都是不一样的然后将每个batch放在每个gpu上独立的执行最后得到的梯度求平均将平均梯度平分给每个gpu执行下一次迭代 这也就意味着你有多少个gpu&#xff0c;训练的速度也会提升…