ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

QT实现自定义拖动边框调整窗口大小

2022-05-01 22:33:25  阅读:327  来源: 互联网

标签:rtPreGeometry QT 自定义 拖动 void QMouseEvent int rtTempGeometry event


自己开发了一个傅里叶周期分析软件,可用于股票,基金,期货、外汇等数据的周期分析和趋势分析;关注微信公众号:QStockView

1.QT系统自带的边框就可以实现拖动改变大小的功能,但是有些场景要自定义程序系统的标题栏,要将系统自带的边框标题栏隐藏掉,设置为frameless形式,这时候就要自定义实现窗口边框的拖动改变大小;

 

 

 实现思路

(1)将主窗口按照从上到下分为1、2、3,从左到右分为1、2、3,这样就变成了一个九宫格;鼠标在外层边缘区域时,鼠标自动变为双向箭头的形式,而且在各个区域的鼠标箭头方向也不一样。可以拖动边框改变大小,在其他区域时鼠标是正常的小箭头图标;

(2)根据鼠标在不同的区域是否按下,并且根据按下的相对位移重新计算窗口的大小,然后resize窗口的大小

2.实现步骤

头文件定义变量和函数

#ifndef FULIYEPERIOD_H
#define FULIYEPERIOD_H

#include <QtWidgets/QMainWindow>
#include "ui_dftAnalyze.h"
#include"NGraph.hpp"
#include <QAxObject>

#define FRAMESHAPE 10 
enum {
    TOPLEFT = 11,
    TOP = 12,
    TOPRIGHT = 13,
    LEFT = 21,
    CENTER = 22,
    RIGHT = 23,
    BUTTOMLEFT = 31,
    BUTTOM = 32,
    BUTTOMRIGHT = 33
};

class FuliyePeriod : public QMainWindow
{
    Q_OBJECT

public:
    FuliyePeriod(QWidget *parent = 0);
    ~FuliyePeriod();
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    int CalCursorCol(QPoint pt);    //个位计算鼠标X的在1,2,3哪个区域位置位置 
    int CalCursorPos(QPoint pt, int colPos);    //用十位表示y在1,2,3哪个区域的位置
    void setCursorShape(int CalPos);    //设置鼠标对应位置11,12,13,21,22,23,31,32,33设置鼠标的形状
 private:
    Ui::FlyAnalyze ui;int     m_iCalCursorPos;
    bool    m_bLeftPress;
    QRect   m_rtPreGeometry;
    QPoint  m_ptViewMousePos;
};

#endif // FULIYEPERIOD_H

源文件实现函数

void FuliyePeriod::mousePressEvent(QMouseEvent * event)
{
    QPoint  pos2 = QCursor::pos();
    pos2 = this->mapFromGlobal(QCursor().pos());//全局坐标转换为主窗口的相对坐标
    m_iCalCursorPos = CalCursorPos(pos2, CalCursorCol(pos2));
    if (event->button() == Qt::LeftButton /*&& Qt::WindowMaximized != windowState()*/)
    {
        if (m_iCalCursorPos != CENTER)
        {
            m_bLeftPress = true;
        }
    }
    m_rtPreGeometry = geometry();
    m_ptViewMousePos = event->globalPos();
}
void FuliyePeriod::mouseMoveEvent(QMouseEvent *event)
{
    //窗体不是最大的话就改变鼠标的形状
    QPoint  pos2 = QCursor::pos();
    pos2 = this->mapFromGlobal(QCursor().pos());
    if (Qt::WindowMaximized != windowState())
    {
        setCursorShape(CalCursorPos(pos2, CalCursorCol(pos2)));
    }

    //获取当前的点,这个点是全局的
    QPoint ptCurrentPos = QCursor::pos();
    //计算出移动的位置,当前点 - 鼠标左键按下的点
    QPoint ptMoveSize = ptCurrentPos - m_ptViewMousePos;
    QRect rtTempGeometry = m_rtPreGeometry;
    if (m_bLeftPress)
    {
        switch (m_iCalCursorPos)
        {
        case TOPLEFT:
            rtTempGeometry.setTopLeft(m_rtPreGeometry.topLeft() + ptMoveSize);
            break;
        case TOP:
            rtTempGeometry.setTop(m_rtPreGeometry.top() + ptMoveSize.y());
            break;
        case TOPRIGHT:
            rtTempGeometry.setTopRight(m_rtPreGeometry.topRight() + ptMoveSize);
            break;
        case LEFT:
            rtTempGeometry.setLeft(m_rtPreGeometry.left() + ptMoveSize.x());
            break;
        case RIGHT:
            rtTempGeometry.setRight(m_rtPreGeometry.right() + ptMoveSize.x());
            break;
        case BUTTOMLEFT:
            rtTempGeometry.setBottomLeft(m_rtPreGeometry.bottomLeft() + ptMoveSize);
            break;
        case BUTTOM:
            rtTempGeometry.setBottom(m_rtPreGeometry.bottom() + ptMoveSize.y());
            break;
        case BUTTOMRIGHT:
            rtTempGeometry.setBottomRight(m_rtPreGeometry.bottomRight() + ptMoveSize);
            break;
        default:
            break;
        }
        //移动窗体,如果比最小窗体大,就移动
        if (rtTempGeometry.width() >= 200 && rtTempGeometry.height() >= 300)
            setGeometry(rtTempGeometry);

    }

}
void FuliyePeriod::mouseReleaseEvent(QMouseEvent * event)
{
    m_bLeftPress = false;
    QApplication::restoreOverrideCursor();
}

 

3.参考文献,修改了一些缺陷;

https://blog.csdn.net/weixin_40222745/article/details/82142333

 

#ifndef FULIYEPERIOD_H#define FULIYEPERIOD_H
#include <QtWidgets/QMainWindow>#include "ui_dftAnalyze.h"#include"NGraph.hpp"#include <QAxObject>
#define FRAMESHAPE 10 enum {TOPLEFT = 11,TOP = 12,TOPRIGHT = 13,LEFT = 21,CENTER = 22,RIGHT = 23,BUTTOMLEFT = 31,BUTTOM = 32,BUTTOMRIGHT = 33};
class FuliyePeriod : public QMainWindow{Q_OBJECT
public:FuliyePeriod(QWidget *parent = 0);~FuliyePeriod();//int dftAnalyzeStock(QString strCode);//void mousePressEvent(QMouseEvent *event);//void mouseReleaseEvent(QMouseEvent *event);//void mouseDoubleClickEvent(QMouseEvent *event);void mousePressEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void mouseDoubleClickEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);int CalCursorCol(QPoint pt);    //个位计算鼠标X的在1,2,3哪个区域位置位置 int CalCursorPos(QPoint pt, int colPos);    //用十位表示y在1,2,3哪个区域的位置void setCursorShape(int CalPos);    //设置鼠标对应位置11,12,13,21,22,23,31,32,33设置鼠标的形状//void showEvent(QShowEvent *e);public slots:void dftAnalyzeStock();void InputExcelData();void SlotWaringDialog(int errorcode, QString strContent);private:Ui::FlyAnalyze ui;NGraph m_original;NGraph* m_graph = NULL;int m_topN = 5;QString m_strCode;QFrame m_lineVertival;QString m_defalutPath = "";bool m_leftMousePressed=false;QPoint m_StartPoint;int     m_iCalCursorPos;bool    m_bLeftPress;QRect   m_rtPreGeometry;QPoint  m_ptViewMousePos;};
#endif // FULIYEPERIOD_H  

标签:rtPreGeometry,QT,自定义,拖动,void,QMouseEvent,int,rtTempGeometry,event
来源: https://www.cnblogs.com/bclshuai/p/16214529.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有