实现无边窗口的移动,笔者也迷惑不解了一段时间。下面给出一个例子,实现无边窗口的移动。
move_widget.h
#pragma once
#include <QWidget>
#include <QLineEdit>
#include <windows.h>
#include <WindowsX.h>
class LineWidget : public QWidget
{
Q_OBJECT
public:
explicit LineWidget(QWidget *parent = 0);
protected:
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
private:
QLineEdit *lineEdit;
};
move_widget.cpp
#include "line_widget.h"
LineWidget::LineWidget(QWidget *parent /*= 0*/) : QWidget(parent)
{
//---lineEdit 控件
lineEdit = new QLineEdit(this);
lineEdit->setMaxLength(8);
lineEdit->setGeometry(30, 15, 100, 20);
//---指定窗口大小
resize(300, 60);
//--设置无边窗口
setWindowFlags(Qt::FramelessWindowHint);
}
/*
函数名:nativeEvent
函数参数:const QByteArray &eventType, void *message, long *result
函数返回值: true/ false
*/
//-----窗口移动
bool LineWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
switch (msg->message)
{
case WM_NCHITTEST:
int xPos = GET_X_LPARAM(msg->lParam) - this->pos().x();
int yPos = GET_Y_LPARAM(msg->lParam) - this->pos().y();
int iCri = 10; //--------------------- int critical 临界值
//---------------------------------------------------------------------- 移动窗体
if (this->childAt(xPos, yPos) == 0) // ---------------------child at 判断当前鼠标是否位于控件
{
*result = HTCAPTION;
}
else
{
return false;
}
return true;
}
return false;
}
#include <windows.h>
#include <WindowsX.h>
上面的这个例子中,实现窗口移动的函数是:
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
就是这样啦~~~~~
赶紧试试试试呗~~~~