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.hqwc.cn/news/642163.html

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

相关文章

【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 | 再谈构造函数:初始化列表,隐式类型转换,缺省值)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 取地址及const取地址操作符重载 再谈构造函数 初始化列表 隐式类型转换 explicit关键字 成员变量缺省值 结语 前言 本篇主要内容&#xff1a;类的六个默认成员函数中…

Nacos分布式配置中心

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://…

Leecode125. 验证回文串

文章目录 概要分析整体架构流程小结 概要 提示&#xff1a;这里可以添加技术概要 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符…

【Qt 学习笔记】Qt常用控件 | 按钮类控件 | Check Box的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件 | Check Box的使用及说明 文章编号&#xff…

学习c语音的自我感受

因为是自学&#xff0c;所以走过不少弯路。去年&#xff0c;受知乎“python性能弱”风潮的影响&#xff0c;学过go,rust。 在学习这些新语言的时候&#xff0c;由衷感受到&#xff0c;或是本身侧重方向的原因&#xff08;如go侧重服务器&#xff09;&#xff0c;或是语言太新不…

网络变压器在网络分析仪上能通过测试,装上设备后网速达不到呢?

Hqst华轩盛(石门盈盛)电子导读&#xff1a;今天和大家一起探讨网络变压器在网络分析仪上能通过测试&#xff0c;装上设备后网通设备网速达不到的可能原因及其处理方式 一、出现这种情况可能有以下原因&#xff1a; 1.1. 设备兼容性问题&#xff1a;设备其它元器件与 网络…

利用selenium发挥vip残存的价值

历史版本谷歌浏览器驱动下载地址 https://chromedriver.storage.googleapis.com/index.html 找到与你电脑当前谷歌浏览器版本一致的驱动然后下载下来(大版本一致即可)。我本地版本是 99.0.04844.51 我这里把 chromedriver 放到 /usr/local/bin 下面了。 启动测试窗口 这里需要…

文章生成器免费版有哪些,哪个好用?

作为一个长期需要写作的人&#xff0c;对文章生成器自然是非常了解&#xff0c;如果搜文章生成器互联网上多到让人应接不暇&#xff0c;但小编今天要谈的是文章生成器免费版&#xff0c;因为看到很多写手朋友都想找一个免费的文章生成器来用&#xff0c;但是大家在网上搜可能很…

一个 cuda shared library 的通用Makefile

0. 文件结构 device 模版函数放在 library/dev/include/*.cuh 模版的实例化和调用封装在 library/dev/*.cu 针对主机代码调用dev 函数而提供的头文件放在 library/dev/*.h, 也就是*.cu中主机函数的声明&#xff1b; 业务逻辑放置在 lib/src/*.cpp中&#xff0c;调用library/…

Vue的虚拟DOM是什么

核心思想 虚拟DOM/Virtual DOM&#xff0c;是数据驱动视图的一种解决方案。核心思想&#xff1a;使用 js对象的形式来表现html的dom结构。 背景 由于现代网络和浏览器的发展&#xff0c;网页的内容也变得很复杂&#xff0c;ajax 诞生让用户可以在不刷新页面的条件下获取到数…

ubuntu18.04安装F4PGA教程

环境搭建教程&#xff1a; f4pga-arch-defs/xilinx/xc7 at main f4pga/f4pga-arch-defs GitHub git clone https://github.com/SymbiFlow/f4pga-arch-defs.git cd f4pga-arch-defs make env cd build 主要是make env&#xff0c;会下载很多东西&#xff0c;然后生成很多描…

Introducing Meta Llama 3: The most capable openly available LLM to date

要点 今天&#xff0c;我们推出 Meta Llama 3&#xff0c;这是我们最先进的开源大型语言模型的下一代。Llama 3型号将很快在AWS&#xff0c;Databricks&#xff0c;Google Cloud&#xff0c;Hugging Face&#xff0c;Kaggle&#xff0c;IBM WatsonX&#xff0c;Microsoft Azur…