• Qt 界面设置无边框之后如何实现缩放界面


    在qt中,如果设置的了窗口无边框的话(即setWindowFlag(Qt::FramelessWindowHint);)那么窗口就没法直接被鼠标拖动了,也没法按住窗口的边界进行缩放。

    如果要实现缩放和拖动,一般来说就需要的重写窗口类的mousePressEvent和mouseMoveEvent事件。

    但是有些时候,比如在界面上放了一个QgraphicsView,主界面就没法响应mousePressEvent和mouseMoveEvent事件。因为该事件被QgraphicsView截取了。这个时候我们就不能简单得通过的重写主窗口的鼠标事件来实现窗口的拖动和缩放了。

    我是这样实现的:

    如下图所示,我在界面上放了4个qlabel,通过qlabel的raise()方法将他们置顶,这样,这些label就能获取到鼠标移动和点击事件了。

    但是,我们是不能直接重写qlabel中的鼠标事件响应函数的,因为在qlabel中,鼠标事件的级别是protected,如下图:

     

    所以这时候就需要我们自己写一个类,继承qlabel,代码如下:

    Mylabel.h

    本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

    1. #ifndef MYLABEL_H
    2. #define MYLABEL_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. class myLabel:public QLabel
    9. {
    10. Q_OBJECT
    11. public:
    12. myLabel(QWidget *parent=nullptr);
    13. void setScaleCursor(int nshape = 0);
    14. void mousePressEvent(QMouseEvent *ev);
    15. void mouseMoveEvent(QMouseEvent *ev);
    16. void mouseReleaseEvent(QMouseEvent *ev);
    17. QPoint m_mousePointOld;
    18. bool m_bKeepDrag;
    19. signals:
    20. void moveEventSig(QPoint point);
    21. void mouseReleasedSig();
    22. };
    23. #endif // MYLABEL_H

    Mylabel.cpp

    1. #include "mylabel.h"
    2. myLabel::myLabel(QWidget *parent):m_bKeepDrag(false)
    3. {
    4. this->setParent(parent);
    5. }
    6. void myLabel::setScaleCursor(int nshape)
    7. {
    8. if(nshape == 1)//左右拉伸
    9. {
    10. setCursor(Qt::SizeHorCursor); //改变光标形状
    11. }
    12. else if(nshape == 2)//上下拉伸
    13. {
    14. setCursor(Qt::SizeVerCursor);
    15. }
    16. else if(nshape == 3)//右下拉伸
    17. {
    18. setCursor(Qt::SizeFDiagCursor);
    19. }
    20. else //正常显示
    21. {
    22. setCursor(Qt::ArrowCursor);
    23. }
    24. }
    25. void myLabel::mousePressEvent(QMouseEvent *ev)
    26. {
    27. if(ev->button() == Qt::LeftButton)
    28. {
    29. m_bKeepDrag = true;
    30. m_mousePointOld = ev->globalPos();
    31. }
    32. }
    33. void myLabel::mouseMoveEvent(QMouseEvent *ev)
    34. {
    35. if(m_bKeepDrag)
    36. {
    37. const QPoint position = ev->globalPos() - m_mousePointOld; //the position of mainfrmae + (current_mouse_position - last_mouse_position)
    38. //move(position.x(), position.y());
    39. emit moveEventSig(position);
    40. m_mousePointOld = ev->globalPos();
    41. }
    42. }
    43. void myLabel::mouseReleaseEvent(QMouseEvent *ev)
    44. {
    45. m_bKeepDrag = false;
    46. emit mouseReleasedSig();
    47. }

    在主界面的类中主要代码如下:
    头文件里面定义这4个label

    1. 1 myLabel *labelLft;
    2. 2 myLabel *labelRit;
    3. 3 myLabel *labelBot;
    4. 4 myLabel *labelTop;

    在cpp文件的构造函数中初始化这4个label,同时通过connect的方式建立信号槽,将label中的鼠标移动事件传给主窗口,从而控制主窗口边界的缩放

    1. //上下左右的label,为了控制界面能够拖动拉伸
    2. labelLft = new myLabel(this);
    3. labelLft->setStyleSheet("QLabel {background-color: transparent;}");//设置背景透明
    4. labelLft->raise();
    5. labelLft->setScaleCursor(1);
    6. connect(labelLft,&myLabel::moveEventSig,this,&MaxPicShowForm::getLeftScaleEvent);
    7. labelRit = new myLabel(this);
    8. labelRit->setStyleSheet("QLabel {background-color: transparent;}");//设置背景透明
    9. labelRit->raise();
    10. labelRit->setScaleCursor(1);//设置为左右拉升光标
    11. connect(labelRit,&myLabel::moveEventSig,this,&MaxPicShowForm::getRightScaleEvent);
    12. labelBot = new myLabel(this);
    13. labelBot->setStyleSheet("QLabel {background-color: transparent;}");//设置背景透明
    14. labelBot->raise();
    15. labelBot->setScaleCursor(2);//设置为上下拉升光标
    16. connect(labelBot,&myLabel::moveEventSig,this,&MaxPicShowForm::getBottomScaleEvent);
    17. labelTop = new myLabel(this);
    18. labelTop->setStyleSheet("QLabel {background-color: transparent;}");//设置背景透明
    19. labelTop->setScaleCursor(2);//设置为上下拉升光标
    20. connect(labelTop,&myLabel::moveEventSig,this,&MaxPicShowForm::getTopScaleEvent);
    21. labelRB = new myLabel(this);
    22. labelRB->setStyleSheet("QLabel {background-color: transparent;}");//设置背景透明
    23. labelRB->setScaleCursor(3);//设置为右下拉升光标
    24. connect(labelRB,&myLabel::moveEventSig,this,&MaxPicShowForm::getRBScaleEvent);
    25. //设置4个label的位置:
    26. labelLft->setGeometry(0,0,5,this->height());
    27. labelRit->setGeometry(this->width()-5,0,5,this->height());
    28. labelBot->setGeometry(0,this->height()-5,this->width(),5);
    29. labelTop->setGeometry(0,0,this->width(),5);

    响应鼠标拖动事件:

    1. 1 void MaxPicShowForm::getLeftScaleEvent(QPoint movPoint)
    2. 2 {
    3. 3 if((pos().x()+movPoint.x())>(pos().x()+this->width()-200))
    4. 4 {
    5. 5 return;//保证拖动窗口左边界的时候,控件宽度至少有200
    6. 6 }
    7. 7 this->setGeometry(pos().x()+movPoint.x(),pos().y(),this->width()-movPoint.x(),this->height());
    8. 8 }
    9. 9
    10. 10 void MaxPicShowForm::getRightScaleEvent(QPoint movPoint)
    11. 11 {
    12. 12 if((pos().x()+this->width()+movPoint.x())<(pos().x()+200))
    13. 13 {
    14. 14 return;//保证拖动窗口右边界的时候,控件宽度至少有200
    15. 15 }
    16. 16 this->setGeometry(pos().x(),pos().y(),this->width()+movPoint.x(),this->height());
    17. 17 }
    18. 18
    19. 19 void MaxPicShowForm::getBottomScaleEvent(QPoint movPoint)
    20. 20 {
    21. 21 if((pos().y()+this->height()+movPoint.y())<(pos().y()+200))
    22. 22 {
    23. 23 return;//保证拖动窗口下边界的时候,控件高度至少有200
    24. 24 }
    25. 25 this->setGeometry(pos().x(),pos().y(),this->width(),this->height()+movPoint.y());
    26. 26 }
    27. 27
    28. 28 void MaxPicShowForm::getTopScaleEvent(QPoint movPoint)
    29. 29 {
    30. 30 if((pos().y()+movPoint.y())>(pos().y()+this->height()-200))
    31. 31 {
    32. 32 return;//保证拖动窗口上边界的时候,控件高度至少有200
    33. 33 }
    34. 34 this->setGeometry(pos().x(),pos().y()+movPoint.y(),this->width(),this->height()-movPoint.y());
    35. 35 q}

    本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓ 

  • 相关阅读:
    Chrome代码分析(二)——EscapeAnalysisPhase
    重温redis和mysql的数据一致性问题
    Java基于SSM的宠物店管理系统
    Excel数据可视化—波士顿矩阵图【四象限图】
    含论文基于JSP的零食销售商城【数据库设计、源码、开题报告】
    HarmonyOS ArkTS HTTP 请求简单封装(二十二)
    Python 深度学习导入的一些包的说明
    Llama 3加入大模型“豪华套餐”,成了吴恩达最好的生日礼物
    22.11.8打卡 Codeforces Round #831 (Div. 1 + Div. 2) A~C
    GitHub的原理及应用详解(一)
  • 原文地址:https://blog.csdn.net/m0_73443478/article/details/128053326