使用 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;
}