首页

文章

Qt中如何利用 png 图片来实现自定义形状的窗口

发布网友 发布时间:2022-04-19 19:12

我来回答

2个回答

热心网友 时间:2023-09-05 03:15

使用 Qt::WindowFlags 可以实现一些不同类型的窗口,如:用 Qt::FramelessWindowHint 来实现无边框窗口,用 Qt::Popup 来实现弹出式的窗口,用 Qt::Tool 来实现工具窗口,用Qt::CustomizeWindowHint 来关闭窗口标题栏以及与 Qt::WindowCloseButton(添加关闭按钮),Qt::WindowMaximumButtonSize(添加最大化按钮)联用来建立只有关闭按钮和最大化按钮的窗口,用 Qt::WindowStaysOnTopHint 使窗口永远在最前端等。 Qt::WidgetAttribute 使窗口支持透明背景以及在关闭后主动销毁。其它一些常用的 Attribute 有:Qt::WA_AcceptDrops 使 widget 支持拖拽操作,Qt::WA_MouseTracking 使 widget 及时响应鼠标移动事件(MouseMoveEvent)。 Qt::setMask() 函数对窗口进行部分区域遮掩来实现各种形状的窗口。部分代码解释:头文件: 1:#ifndef SHAPEDWIDGET_H 2:#define SHAPEDWIDGET_H 3: 4:#include <QWidget> 5:class QPoint; 6:class QPixmap; 7:class ShapedWidget : public QWidget 8: { 9: Q_OBJECT 10:public: 11:explicit ShapedWidget(QWidget *parent = 0); 12: ~ShapedWidget(); 13: 14:private slots: 15:void changeSkin(); 16: 17:protected: 18:void mousePressEvent(QMouseEvent *); 19:void mouseMoveEvent(QMouseEvent *); 20:void paintEvent(QPaintEvent *); 21: 22:private: 23:void initData(); 24:void initVisualComponents(); 25:void setupContextMenu(); 26: 27: QPoint* dragPos_; 28: QPixmap* backgroundPixmap_; 29: }; 30: 31:#endif // SHAPEDWIDGET_H构造: 1: ShapedWidget::ShapedWidget(QWidget *parent) : 2: QWidget(parent, Qt::FramelessWindowHint) //无边框窗体 3: { 4: initData(); //初始化数据,这个demo里面就两个,具体下面有解释 5: initVisualComponents(); //初始化私有可视部件,这个demo里面没有私有的其它部件,所以只做了窗口的一些属性设置 6: setupContextMenu(); //设置右键菜单,分配各种QAction内存空间以及连接SIGNALS和SLOTS 7: setAttribute(Qt::WA_DeleteOnClose); //关闭事件发生后就主动从内存中销毁窗口 8: setAttribute(Qt::WA_TranslucentBackground); //透明背景支持 9: } 拖拽移动窗体(下面有图示): 1:void ShapedWidget::mousePressEvent(QMouseEvent *event) 2: { 3:if(event->button() == Qt::LeftButton) 4: { 5: *dragPos_ = event->globalPos() - frameGeometry().topLeft(); 6: event->accept(); 7: } 8: } 9: 10:void ShapedWidget::mouseMoveEvent(QMouseEvent *event) 11: { 12:if(event->buttons() & Qt::LeftButton) 13: { 14: move(event->globalPos() - *dragPos_); 15: event->accept(); 16: } 17: } 窗口绘制: 1:void ShapedWidget::paintEvent(QPaintEvent *) 2: { 3: QPainter painter(this); 4: painter.fillRect(0, 0, backgroundPixmap_->width(), backgroundPixmap_->height(), *backgroundPixmap_); 5: } 更换皮肤: 1:void ShapedWidget::changeSkin() 2: { 3: QAction* source = qobject_cast<QAction*>(sender()); //获取发送该信号的信号源,并转换对象 4: backgroundPixmap_->load(source->data().toString()); //因为给每个 QAction 赋了图片的地址的字符串 5://所以可以通过 data() 来获取该值,并更新背景图片的内容 6: resize(backgroundPixmap_->width(), backgroundPixmap_->height()); //窗口大小尽可能小

热心网友 时间:2023-09-05 03:15

  1.可以设置QWidget的窗口属性Qt::WA_TranslucentBackground为true来实现。但是利用这个属性有很大的*。在window平台下,你必须设置Qt::FramelessWindowHint属性为true,设置窗口为一个没有标题栏的窗口。在X11平台下,你还要依靠 a compositing window manager.局限很多
  2利用setMask()函数来实现,
  void QWidget::setMask ( const QRegion & region )
可以使得仅和region重叠的区域可见。但是,如果这个区域包括widget的rect()以外的像素,窗口控制的这个区域可见不可见,将取决于具体的平台。

  所以,如果获得这个不规则的区域,然后在resizeEvent函数中调用这个函数,就可以获得一个不规则的形状的窗口。
  
  下面的代码是如何使得窗口成为一个圆角矩形。
  void resizeEvent(QEvent* event)
  {
  QPainterPath path;
  QRectF rect = QRectF(0,0,200,100);
  path.addRoundedRect(rect,20,15);
  
  QPolygon polygon= path.toFillPolygon().toPolygon();//获得这个路径上的所有的点
QRegion region(polygon);//根据这个点构造这个区域
setMask(region);

  }
  由于QPainterPath可以构造很多不规则的形状,所以我们可以构造很多不规则形状的窗口
年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 QT如何实现自定义下拉列表 关于QT自定义类在javascript环境中的使用 QT 自己定义的几个槽函数 分别和不同的按钮进行con... 请问QT如何自己定义槽函数和使用? QT的自定义进程步骤问题,要怎么解决。 QT自定义控件整合 qt c++ 做自定义界面 自定义关闭 最大化 最小化按... QT怎样使用自定义链表元素 如何在Qt中使用自定义数据类型 如何烧好春节的年夜饭? 重阳节吃什么 美味菜谱推荐 家常菜100道菜谱 家常年夜饭的菜谱跟做法 家常菜菜谱食谱大全 一星期的菜谱家常菜有哪些? 中秋节吃什么家常菜? qq上的信息怎么发到微信朋友圈 如何发qq朋友圈 qq的图片怎么才能发到朋友圈中 为什么PS 过的照片用QQ发不出去 qt 保存自定义路径,直接写死的那种,不是弹出保存... 请教如何在QT自定义线程类中使用QTimer定时器功能 QT designer做一个小程序。 要怎么添加自定义槽函数? qt自定义的函数怎么调用mainwindow 一加7pro贴闪模出气泡 我的QQ群签到功能为什么突然不管用了?每个群都无... QQ群里的签到为什么打不开,老是正在加载网页? 现在电脑q群不能查看统计群签到情况了吗? qq群禁言还能签到吗 一加7pro没有录屏,小窗 扫及肝左叶散在钙化斑或肝内胆管结石可能是什么意思 吊牌上的是什么意思,13000左右贵不贵啊 甘禅学步是什么意思 thistshirt是什么意思 bird是什么意思pretty是什么意思 苹果手机上误删的软件怎么恢复 苹果手机app误删怎么恢复? 苹果手机删除软件怎么恢复 苹果手机怎么从icloud恢复被删除的软件 新鲜板栗营养价值及功效与作用
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com