【无标题】

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bclshuai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值