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

这篇具有很好参考价值的文章主要介绍了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按钮

Qt绘制边框有阴影兼容性问题,# QT绘图相关,qt

这是在Win11上显示的效果

Qt绘制边框有阴影兼容性问题,# QT绘图相关,qt

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

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

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

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

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

改成

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

运行效果如下:

Qt绘制边框有阴影兼容性问题,# QT绘图相关,qt

 现在在Win10上没有黑边效果了文章来源地址https://www.toymoban.com/news/detail-856288.html

到了这里,关于Qt绘制边框有阴影兼容性问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Microsoft edge兼容性问题

    连接需要登录界面的无线网络时候,Microsoft edge老是会出现兼容性问题的错误。 这时候设置什么也打不开。 通过网上搜索,我是通过修改注册表的方法成功的。 Win10 Edge兼容性问题打不开|解决浏览器兼容性问题_白云一键重装系统 步骤一:打开运行 ①可以同时按键盘的Win和

    2024年02月10日
    浏览(63)
  • 移动端兼容性问题集锦

    去年主要工作就是混合开发,写app内嵌的h5。在开发期间多多少少遇到些兼容性问题,最近工作比较清闲,整理下方便以后查阅,也希望能帮助到一些同学。 并且本文会持续补充内容,欢迎关注我,另外我会更新一些前端方面的其他一些知识。 问题描述: ios规定日期要以“

    2023年04月08日
    浏览(41)
  • 解决flex gap兼容性问题

    一个项目写下来,在网页端预览的时候正常,结果到产品经理手上。 设计稿样式 实际产品手机上样式 产品:“你这玩意儿怎么没间距?” 我:“为什么我的正常???呐呐呐你看我手机(来自RedmeK50Utral)” 产品:“哦,你看我的手机(来自荣耀20)” 我:“。。。” 至此

    2024年02月07日
    浏览(54)
  • 解决前端浏览器兼容性问题

    解决前端浏览器兼容性问题时前端开发中的一项重要任务。以下是一些常用的方法来解决这类问题: 1、使用css前缀: 不同浏览器可能对某些CSS属性有不同的前缀要求。可以使用CSS前缀来覆盖不同浏览器的样式需求。例如,使用 -webkit 前缀来适配WebKit(Chrome、Safari)浏览器

    2024年02月09日
    浏览(47)
  • 如何解决群晖硬盘兼容性问题

    首先,在群晖设置-终端-启用SSH。然后,下载putty,用administrator管理权限组的账号登录, 如输入“ssh 你的DSM用户名@IP”,输入登录密码登录。最后,运行以下命令切换到root权限。 sudo - i 进到系统配置文件夹。 cd  /etc.default 备份配置文件 cp  synoinfo.conf synoinfo.conf2 编辑配置文

    2024年02月09日
    浏览(211)
  • 【H5】H5安卓、ios兼容性问题

    H5在安卓机型和IOS机型或者相同机型的不同浏览器中的某些样式会存在不一样的表现,所以需要解决相应的兼容性问题 1、IOS端兼容input光标高度 问题症状:input输入框光标,在安卓手机上显示没有问题,但是在苹果手机上当点击输入的时候,光标的高度和父盒子的高度一样

    2024年02月16日
    浏览(60)
  • 微信小程序、h5兼容性问题(1)

    1. 微信小程序中border-image 设置渐变 导致border-radius 不生效。 不建议两者同时使用,实测ipone12 不兼容, ipone 12以上正常显示。可以使用背景图片代替。 2. h5 使用原生table tr、th、td封装表格,在ios 中样式失效 建议使用dev 整体布局。 3. 企业微信群二维码插件materialPlugin、cell

    2023年04月09日
    浏览(62)
  • 【前端】vant组件移动端兼容性问题汇总

    记录使用vant组件开发过程中遇到的兼容性问题 问题截图: 解决方法: 模拟滚动触发日历组件的加载,在van-calendar上绑定@open=\\\"openCalendar\\\"事件 参考来源:vant 日历插件,部分全面屏手机显示不出来 解决方法: 更改挂载节点,在van-popup上加get-container=“body” 参考来源:vant兼容

    2024年02月10日
    浏览(53)
  • vite项目低版本浏览器兼容性问题

    技术: vite+vue3.2+ts+element-plus 开发环境没有问题,但是打包后的代码放到正式环境,页面空白... 现场的小伙伴发来报错问题  Uncaught SynntaxError:Unexpected token ? 纳尼,这这这...什么原因,一头雾水 用火狐浏览器访问,没有报错,开始狂摆...时间一点点流逝,全网没有找到解决

    2024年02月09日
    浏览(48)
  • vc 6.0++解决兼容性及闪退问题

    文章同步于我的个人博客https://quan9i.github.io/vc++/,欢迎大家访问 我在安装好vc6.0后出现了如下问题,总结如下 在安装完成后运行程序会出现不兼容的情况,如下图所示 此时我们右键一下,然后选择打开文件所在位置 找到MSDEV文件,并更名为MSDEV2 此时我们右键快捷方式,点击

    2024年02月04日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包