qt 界面去掉系统边框2.0版

摘要:
以前的版本中存在一个错误。如果将鼠标移动到界面中的可单击小部件上并按住鼠标左键,则界面可能会意外移动。这是因为当鼠标移动到可单击的小部件时,mousePressEvent信号被可单击的控件阻止,因此包含该小部件的界面的mousePressEvents不会被触发。到qt论坛咨询官方工作人员并进行一些修改。

之前的一版存在bug。如果将鼠标放移动到界面内某个可点击的widget上(如:QPushButton)上,按住鼠标左键不放,界面可能会出现界面非预期移动的问题。

那是因为当鼠标移动到可点击的widget(如:QPushButton)上时,mousePressEvent这个信号被可点击的widget拦截了,所以包含这个widget的界面的mousePressEvent(QMouseEvent *event)不会被触发。

所以m_last_mouse_position记录的还是上次鼠标点击左键时的位置。去qt论坛咨询了一下官方人员,作了一下修改。具体代码如下。

 1 #ifndef CUSTOMIZE_QWIDGET_H
 2 #define CUSTOMIZE_QWIDGET_H
 3 #include <QDialog>
 4 #include <QMouseEvent>
 5 
 6 class CustomizeQWidget : public QDialog
 7 {
 8     Q_OBJECT
 9 public:
10     explicit CustomizeQWidget(QWidget *parent = 0);
11     ~CustomizeQWidget();
12 public slots:
13     void on_button_close_clicked();
14     //void on_button_minimize_cliked();
15 private:
16     void paintEvent(QPaintEvent *);
17     void mousePressEvent(QMouseEvent *event);
18     void mouseMoveEvent(QMouseEvent *event);
19     void mouseReleaseEvent(QMouseEvent *event);21 private:
22     QPoint m_last_mouse_position;
23 
24     bool m_move_widget_flag;
25 };
26 #endif // CUSTOMIZE_QWIDGET_H
 1 #include "customize_ui/customize_qwidget.h"
 2 #include <QStyleOption>
 3 #include <QPainter>
 4 #include <QBrush>
 5 
 6 CustomizeQWidget::CustomizeQWidget(QWidget *parent):
 7                                     QDialog(parent),
 8                           m_move_widget_flag(false)
 9 {
10     this->setWindowFlags(windowFlags() | Qt::FramelessWindowHint | Qt::Dialog);
11 }
12 
13 CustomizeQWidget::~CustomizeQWidget()
14 {
15 }
16 
17 void CustomizeQWidget::paintEvent(QPaintEvent *)
18 {
19     QStyleOption opt;
20     opt.init(this);
21     QPainter p(this);
22     style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
23 }
24 
25 void CustomizeQWidget::mousePressEvent(QMouseEvent *event)
26 {
27     if(event->button() == Qt::LeftButton)
28     {
29         m_last_mouse_position = event->globalPos();
30         m_move_widget_flag = true;
31     }
32 }
33 
34 void CustomizeQWidget::mouseMoveEvent(QMouseEvent *event)
35 {
36     if (!event->buttons().testFlag(Qt::LeftButton) || !m_move_widget_flag)
37             return;
38     const QPoint position = pos() + event->globalPos() - m_last_mouse_position; //the position of mainfrmae + (current_mouse_position - last_mouse_position)
39     move(position.x(), position.y());
40     m_last_mouse_position = event->globalPos();
41 }
42 
43 void CustomizeQWidget::mouseReleaseEvent(QMouseEvent *event)
44 {
45     if(event->button() == Qt::LeftButton)
46     {
47         m_move_widget_flag = false;
48     }
49 }
50 void CustomizeQWidget::on_button_close_clicked()
51 {
52     this->close();
53 }
54 

免责声明:文章转载自《qt 界面去掉系统边框2.0版》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql快速保存插入大量数据一些方法总结微信公众号测试账号-redirect_uri域名与后台配置不一致,错误代码:10003下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

学习HTML5获取地理位置定位信息--(通过百度地图API,google地图API的两种方式)

前言:它是依赖于 百度地图API或google地图API 的功能,并且要允许定位; 思想:h5方式仅能获取到经纬度,通过得到的经纬度然后ajax调用百度地图和谷歌地图等提供的这方面的接口,才获取到的具体位置信息。 HTML5提供了地理位置定位功能(Geolocation API),能确定用户位置,我们可以借助HTML5的该特性开发基于地理位置信息的应用。本...

js实现弹窗居中

在一些页面中,我们总会遇到一些弹窗不居中的时候,还要根据浏览器的大小来调整弹窗的弹出位置, 之前我也遇到这样的问题,现在我把我知道的呈现给大家 css样式  .windowBox{    500px; } .mid-tanBox{    position: fixed;  top: 50%;  left: 50%;    margin-left: -250...

css实现步骤条

实现效果 html <ul class="steps"> <li class="active">申请完成</li> <li class="active">资料上传</li> <li>专员审核</...

iOS 中的frame,bounds,center,transform关联

这里有一篇好文章 http://www.winddisk.com/2012/06/07/transform/ 先看几个知识点,UIView 的frame,bounds,center,transform属性,CAlayer的position,anchorPoint,transform. 1.当一个view的frame被更改时 a.当更改size时,它的bou...

大屏适配window.onresize监听窗口变化,该方法已用于生产

1 js部分 // 本次开发场景2880*1080 配合css 2 mounted () { 3 this.pageResize() 4 window.onresize = () => { 5 setTimeout(() => { 6...

使用jsPlumb插件实现动态连线功能

这周去看了两天的羽毛球亚锦赛,工作有提前晚上加班做一些,但是技术文章却拉下了。这段时间一直在寻找可以实现前端元素动态连线的功能,找了好几个库,考虑过用d3或者原生svg和canvas来实现,最后和同项目的同事商量后决定使用jsPlumb插件库来做。jsPlumb是一个强大的JavaScript连线库,它可以将html中的元素用箭头、曲线、直线等连接起...