永发信息网

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

答案:1  悬赏:50  手机版
解决时间 2021-01-27 18:25
Qt中如何利用 png 图片来实现自定义形状的窗口
最佳答案
Qt 中 QWidget::setMask() 的用法 把QWidget 自定义成各种形状,使用 png 透明图片作为窗体显示,效果如下
关键知识: Qt::WindowFlags 使窗口支持无边框 [From Qt Doc:This enum type is used to specify various window-system properties for the widget. They are fairly unusual but necessary in a few cases. Some of these flags depend on whether the underlying window manager supports them.]。使用 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() 函数对窗口进行部分区域遮掩来实现各种形状的窗口。[From Qt Doc:Causes only the pixels of the widget for whichbitmap has a corresponding 1 bit to be visible. If the region includes pixels outside the rect() of the widget, window system controls in that area may or may not be visible, depending on the platform.]。Qt::ContextMenuPolicy 来配置窗口的右键菜单方案。[From Qt Doc:This enum type defines the various policies a widget can have with respect to showing a context menu.]。paintEvent() 回调函数来对窗口进行绘制。 重写 mousePressEvent() 和mouseMoveEvent() 函数来实现窗口的拖拽移动(无边框窗口没有标题栏,默认拖拽窗体是没法移动窗口的)。部分代码解释:头文件: 1:#ifndef SHAPEDWIDGET_H 2:#define SHAPEDWIDGET_H 3: 4:#include 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(sender()); //获取发送该信号的信号源,并转换对象 4: backgroundPixmap_->load(source->data().toString()); //因为给每个 QAction 赋了图片的地址的字符串 5://所以可以通过 data() 来获取该值,并更新背景图片的内容 6: resize(backgroundPixmap_->width(), backgroundPixmap_->height()); //窗口大小尽可能小,尽管在 mask 外的窗体不会响应 mouse event 7: clearMask(); //清除原来的 mask 8: setMask(backgroundPixmap_->mask()); //根据新的背景图片来重新设置 mask 9: update(); //更新窗口 10: }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
如图,△ABC中,AB=5,AC=13,BC边上的中线AD=6,
谁知道山东农业大学怎么个情况能造成留级
快手怎么才有直播的资格?
资阳人的意思是什么啊?知道的请说下!
中石油管道局怎么样,好不好,发展前景等评价
学习中只有的快乐
求星之卡比电脑上的双人玩法!!!模拟器已下
试问,名义徐变系数,与下列何项数值最为接近
红远怎么去啊,我要去那办事
貙武的意思是什么啊?知道的请说下!
狙击手幽灵战士多少关那一共
蓝瑟翼神检查发动机故障灯亮什么原因
某砂土场地地表水平,无外荷载,砂土的c=0,
威姿漫服饰地址在哪,我要去那里办事
我的爸爸去打工日记50个字
推荐资讯
凤临阁美容养生馆怎么去啊,我要去那办事
冯石村民委员会地址有知道的么?有点事想过去
求PS和马云握手的合照
周公解梦,梦到好多蚯蚓在脚底板里
保险丝断了,换上新的,可是推上电闸,冒火花
研究生公费和自费是什么意思?是像高考那样吗
Vevina 和Vanessa哪个英文名好
张建旺理发店地址在什么地方,想过去办事
巴瑞雪西餐厅加盟多少钱
金晖太阳能热水器功率是多少瓦?加热功率,属于
我喜欢简单的事物干净的东西和清楚的感觉,什
逍遥清风郎 谁帮对几句诗词,要求逍遥自在,放
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?