使用 Qt 实现无边框窗口的鼠标拖动移动效果,核心在于重写 mousePressEvent 与 mouseMoveEvent,记录按下时鼠标相对窗口的局部坐标,并在移动过程中根据全局坐标计算窗口新位置。

MainWindow 头文件

在 MainWindow 中声明两个成员变量 _x / _y 用于保存鼠标按下时的局部坐标,并重写鼠标按下与移动事件:

class MainWindow : public QMainWindow
                {
                    Q_OBJECT
                
                public:
                    explicit MainWindow(QWidget *parent = 0);
                    ~MainWindow();
                
                
                	int _x;
                	int _y;
                
                	void mouseMoveEvent(QMouseEvent *e)
                	{
                		move(e->globalPos().x() -_x,e->globalPos().y() - _y);
                
                	}
                	void mousePressEvent(QMouseEvent *e)
                	{
                	/*不然会闪*/
                		_x = e->localPos().x();
                		_y = e->localPos().y();
                	}
                private:
                    Ui::MainWindow *ui;
                };

MainWindow 构造函数

在构造函数中通过 setWindowFlags(Qt::FramelessWindowHint) 去掉系统边框,并把关闭按钮的点击信号绑定到窗口的 close() 槽:

MainWindow::MainWindow(QWidget *parent) :
                    QMainWindow(parent),
                    ui(new Ui::MainWindow)
                {
                    ui->setupUi(this);
                	this->setWindowTitle("QT window");
                
                	this->setWindowFlags(Qt::FramelessWindowHint);
                	ui->pushButton->setText("Close");
                	this->connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(close()));
                }
                
                MainWindow::~MainWindow()
                {
                    delete ui;
                }