了解无边框窗体的拖动和拉伸你需要了解以下的原理,看图:
了解了这个就好懂多了,直接看代码,我只实现了在右下角进行拖动,其他的部位原理可以实现
.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMouseEvent>
class MainWindow : public QMainWindow
{
Q_OBJECT
protected:
void mouseMoveEvent(QMouseEvent * event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent * event);
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QPoint pLast;
bool m_bPressed;
QPoint clickPos;
bool m_bresize=false;
};
#endif // MAINWINDOW_H
.cpp
#include "mainwindow.h"
#include <qdebug.h>
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() && Qt::LeftButton&&m_bPressed)
{
move(event->globalPos() - pLast);
event->accept();
}
if (isMaximized())
{
return;
}
int iWidth=this->width();
int iHeight=this->height();
if(event->pos().x()>iWidth-10&&event->pos().y()>iHeight-10)
{
this->setCursor(Qt::SizeFDiagCursor);
int width=this->width()-(this->width()-event->pos().x());
int height=this->height()- (this->height()-event->pos().y());
if(m_bresize==true)
{
this->resize(width,height);
qDebug()<<"ggggggg";
}
}
else
{
this->setCursor(Qt::ArrowCursor);
}
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
int width=this->width();
int height=this->height();
if(event->pos().x()>width-10&&event->pos().y()>height-10&&event->buttons() == Qt::LeftButton)
{
clickPos=event->pos();
m_bresize=true;
qDebug()<<"11111";
}
else
{
m_bPressed = true;
pLast = event->globalPos() - this->pos();
event->accept();
qDebug()<<"2222";
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
m_bPressed = false;
m_bresize=false;
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowFlags(Qt::FramelessWindowHint | windowFlags());
this->resize(500,500);
this->setMouseTracking(true);
}
MainWindow::~MainWindow()
{
}
效果图:
ヾ( ̄▽ ̄)ByeBye