QT练手项目二:鼠标拖动窗口

本文介绍如何在Qt中创建无边框窗口,并通过重写鼠标事件实现窗口的拖动功能。文章详细解释了鼠标点击、移动和释放事件的处理过程,使窗口能够响应鼠标操作进行移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     对于一个没有边框的窗口,鼠标是无法将它拖动的,于是我们就需要自己重写鼠标的点击、移动和释放事件来跟踪鼠标,从而

达到使用鼠标拖动窗口,这里我们就简单的使用一个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 <QMainWindow>
#include <QPushButton>
#include <QMouseEvent>
#include <QPoint>

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);
}

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值