windows下Qt无边框可变化的实现

#ifndef FLWIDGET_H
#define FLWIDGET_H

#include <QWidget>
#include <QMouseEvent>

class FLWidget : public QWidget
{
 Q_OBJECT
public:
 explicit FLWidget(QWidget *parent = nullptr);
 ~FLWidget();

public:
 bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;
 void mousePressEvent(QMouseEvent* e) override;
 void mouseMoveEvent(QMouseEvent* e) override;

private:
 int m_bouderWidth;
 QPoint m_curPos;

signals:

};

#endif // FLWIDGET_H


// cpp

#include "flwidget.h"
#ifdef Q_OS_WIN
#include <windows.h>//注意头文件
#include <windowsx.h>
#include <QMouseEvent>
#endif

namespace
{
    constexpr int BOUDERWIDTH = 10;
}

FLWidget::FLWidget(QWidget *parent) : QWidget(parent), m_bouderWidth(BOUDERWIDTH)
{
    setMouseTracking(true);
    setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
    setStyleSheet("background:red");
    resize(500, 500);
}

FLWidget::~FLWidget()
{

}

void FLWidget::mousePressEvent(QMouseEvent *e)
{
#ifdef Q_OS_WIN
    if (e->button() == Qt::LeftButton)
        m_curPos = e->pos();
#endif
    return QWidget::mousePressEvent(e);
}
void FLWidget::mouseMoveEvent(QMouseEvent *e)
{
#ifdef Q_OS_WIN
    if (e->buttons() & Qt::LeftButton)
        move(e->pos() + pos() - m_curPos);
#endif
    return QWidget::mouseMoveEvent(e);
}

bool FLWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef Q_OS_WIN
    MSG* msg = (MSG*)message;
    switch(msg->message)
    {
        case WM_NCHITTEST:
            int xPos = GET_X_LPARAM(msg->lParam) - this->frameGeometry().x();
            int yPos = GET_Y_LPARAM(msg->lParam) - this->frameGeometry().y();
            int nUseFulWidth = width() - m_bouderWidth;
            int nUseFulHeight = height() - m_bouderWidth;
            if (xPos < m_bouderWidth && yPos < m_bouderWidth)    //左上角
                *result = HTTOPLEFT;
            else if (xPos>= nUseFulWidth && yPos < m_bouderWidth)    //右上角
                *result = HTTOPRIGHT;
            else if (xPos < m_bouderWidth && yPos >= nUseFulHeight)    //左下角
                *result = HTBOTTOMLEFT;
            else if (xPos >= nUseFulWidth && yPos >= nUseFulHeight)    //右下角
                *result = HTBOTTOMRIGHT;
            else if (xPos < m_bouderWidth)    //左边
                *result =  HTLEFT;
            else if (xPos >= nUseFulWidth)    //右边
                *result = HTRIGHT;
            else if (yPos < m_bouderWidth)    //上边
                *result = HTTOP;
            else if (yPos >= nUseFulHeight)    //下边
                *result = HTBOTTOM;
            else
                return false;

            return true;
        }
#endif
    return QWidget::nativeEvent(eventType, message, result);    //此处返回false,留给其他事件处理器处理

}

文章作者: 张小飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 张小飞 !
 上一篇
Linux下Qt实现无边框可缩放的窗口 Linux下Qt实现无边框可缩放的窗口
序在Linux平台上做desktop应用的还是非常少的。所以基本上网上这部分资料是没有的。Linux平台又不像Win那么多API。这次的实现,本来自己想写xlib的函数的,然后机智的我从deepin的代码里把他们封装好的抠出来了,然后补充了
2020-06-27 张小飞
下一篇 
Linux下使用WPS做office的二次开发 Linux下使用WPS做office的二次开发
序上个版本WPS在Linux上就已经支持二次开发了,可以直接去看官网相关的介绍。https://open.wps.cn/ 我们选择WPS的客户端进行二次开发 开发环境 Ubuntu18.04 wps-office_11.1.0.9126_a
2020-06-27 张小飞
  目录