对于一个没有边框的窗口,鼠标是无法将它拖动的,于是我们就需要自己重写鼠标的点击、移动和释放事件来跟踪鼠标,从而
达到使用鼠标拖动窗口,这里我们就简单的使用一个mainwindow来演示。这个小项目代码非常少,适合用来入门QT。
首先是对窗口做无边框设置:
setWindowFlags(Qt::FramelessWindowHint);
然后我们做一个退出按钮:
m_buttonClose = new QPushButton(this);
m_buttonClose->setText(tr("退出"));
//连接退出功能
connect(m_buttonClose, SIGNAL(clicked()), this, SLOT(close()));
以上,一个简单的无框窗口就创建好了。
我们来看看鼠标点击事件的重写:
void MainWindow::mousePressEvent(QMouseEvent *event)
{
//读取坐鼠标点击坐标点
m_lastPoint = event->globalPos();
}
再看看鼠标移动事件的重写:
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
//把移动的位置记录下来,这是相对于上个位置的距离
int dx = event->globalX() - m_lastPoint.x();
int dy = event->globalY() - m_lastPoint.y();
m_lastPoint = event->globalPos(); //更新记录点
move(x() + dx, y() + dy); //窗口移动到此处
}
最后看看鼠标释放事件:
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
//记录新移动到的坐标相对于上个坐标的位置
int dx = event->globalX() - m_lastPoint.x();
int dy = event->globalY() - m_lastPoint.y();
move(x() + dx, y() + dy);
}
到这里我们的整个小项目就已经完成啦。
下面我就贴上所有代码吧。
/*-------------------------------MainWindow.h--------------------------*/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
//退出按钮
QPushButton *m_buttonClose;
//记录鼠标位置
QPoint m_lastPoint;
protected:
//鼠标点击事件
void mousePressEvent(QMouseEvent *event);
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *event);
};
#endif // MAINWINDOW_H
/*------------------------------------------MainWindow.cpp---------------------------------------*/
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
//标题栏
setWindowTitle(tr("移动无边框窗口"));
//设置显示位置
setGeometry(500, 300, 300, 300);
//设置窗口为无边框.无边窗就意味着无法通过拖动鼠标移动窗口。
//那么我们就需要自己写鼠标捕捉事件并跟随鼠标移动窗口
setWindowFlags(Qt::FramelessWindowHint);
//设置图标
setWindowIcon(QIcon(":/image/icon_image.ico"));
//实例化一个按钮,功能是退出
m_buttonClose = new QPushButton(this);
m_buttonClose->setText(tr("退出"));
m_buttonClose->setFont(QFont("TImes", 20, QFont::Black));
//连接退出功能
connect(m_buttonClose, SIGNAL(clicked()), this, SLOT(close()));
}
MainWindow::~MainWindow()
{
}
//鼠标点击事件
void MainWindow::mousePressEvent(QMouseEvent *event)
{
//读取坐鼠标点击坐标点
m_lastPoint = event->globalPos();
}
//鼠标移动事件
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
//把移动的点记录下来
int dx = event->globalX() - m_lastPoint.x();
int dy = event->globalY() - m_lastPoint.y();
m_lastPoint = event->globalPos(); //更新记录点
move(x() + dx, y() + dy); //窗口移动到此处
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
//记录移动到的坐标
int dx = event->globalX() - m_lastPoint.x();
int dy = event->globalY() - m_lastPoint.y();
move(x() + dx, y() + dy);
}