在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口。本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口的缩放相关的程序放在一起,下面专门单独分离出来。
窗口的拖放只涉及到鼠标事件:按下操作、释放操作和移动操作,因此只需要重写这三个函数。由于程序比较简单,并且注释也比较详细,就不作过多介绍。新建一个基类为QWidget的Qt Gui应用程序,只需修改widget.h和widget.cpp文件如下:
1、widget.h文件
#ifndef WIDGET_H #define WIDGET_H #include <QWidget>//注意我使用的是Qt5,Qt4与Qt5的区别可以参考http://qt-project.org/wiki/Transition_from_Qt_4.x_to_Qt5 #include<QMouseEvent> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); QPoint move_point; //移动的距离 bool mouse_press; //鼠标按下 //鼠标按下事件 void mousePressEvent(QMouseEvent *event); //鼠标释放事件 void mouseReleaseEvent(QMouseEvent *event); //鼠标移动事件 void mouseMoveEvent(QMouseEvent *event); private: Ui::Widget *ui; }; #endif // WIDGET_H
2、widget.cpp文件
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); this->setMouseTracking(false); setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);//设置主窗口无边框 } Widget::~Widget() { delete ui; } void Widget::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { this->setMouseTracking(true); mouse_press = true; //鼠标相对于窗体的位置(或者使用event->globalPos() - this->pos()) move_point = event->pos();; } } void Widget::mouseReleaseEvent(QMouseEvent *event) { //设置鼠标为未被按下 mouse_press = false; } void Widget::mouseMoveEvent(QMouseEvent *event) { //若鼠标左键被按下 // qDebug()<<"mouse_press="<<event->globalPos(); if(mouse_press) { //鼠标相对于屏幕的位置 QPoint move_pos = event->globalPos(); //移动主窗体位置 this->move(move_pos - move_point); } }
时间: 2024-10-13 21:59:56