QT笔记之自定义窗口拖拽移动

1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽)

方法一:

转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html

 .h文件中

 1 //自己重新实现拖动操作
 2 protected:
 3 
 4 void mouseMoveEvent ( QMouseEvent * event );
 5 
 6 void mousePressEvent ( QMouseEvent * event );
 7 
 8 void mouseReleaseEvent(QMouseEvent *);
 9 
10 private:
11 //自己重新实现拖动操作
12 QPoint mousePosition;
13 bool isMousePressed;

.cpp文件中

//标题栏的长度
const static int pos_min_x = 0;
const static int pos_max_x = 800-40;
const static int pos_min_y = 0;
const static int pos_max_y = 20;
//自己实现的窗口拖动操作
void MainWindow::mousePressEvent(QMouseEvent *event)
{
mousePosition = event->pos();
//只对标题栏范围内的鼠标事件进行处理
if (mousePosition.x()<=pos_min_x)
return;
if ( mousePosition.x()>=pos_max_x)
return;
if (mousePosition.y()<=pos_min_y )
return;
if (mousePosition.y()>=pos_max_y)
return;
isMousePressed = true;
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if ( isMousePressed==true )
{
QPoint movePot = event->globalPos() - mousePosition;
move(movePot);
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
isMousePressed=false;
}

方法二:(可以拖拽窗口任意位置)

转载:http://blog.sina.com.cn/s/blog_a6fb6cc90101au8r.html

自定义界面步骤:

1.设置标题栏隐藏

//设置标题栏隐藏并设置位于顶层

setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);

//可获取鼠标跟踪效果

setMouseTracking(true);

//注意:Qt::WindowStaysOnTopHint这个很重要,如果没有这句话即使是自定义界面成功了,界面可以拖动,但也还存在问题,那就是界面能够拖动到任务栏之下!

2、 声明变量与鼠标事件
    QPoint move_point; //移动的距离
    bool mouse_press; //鼠标按下
    //鼠标按下事件
    void mousePressEvent(QMouseEvent *event);
    //鼠标释放事件
    void mouseReleaseEvent(QMouseEvent *event);
    //鼠标移动事件
    void mouseMoveEvent(QMouseEvent *event);
3、定义鼠标事件
        void LoginDialog::mousePressEvent(QMouseEvent *event)
    {  
        if(event->button() == Qt::LeftButton)
        {
            mouse_press = true;
            //鼠标相对于窗体的位置(或者使用event->globalPos() - this->pos())
            move_point = event->pos();;
        }
    }
    void LoginDialog::mouseMoveEvent(QMouseEvent *event)
    {
        //若鼠标左键被按下
        if(mouse_press)
        {
            //鼠标相对于屏幕的位置
            QPoint move_pos = event->globalPos();

            //移动主窗体位置
            this->move(move_pos - move_point);
        }
    }
    void LoginDialog::mouseReleaseEvent(QMouseEvent *event)
    {  
        //设置鼠标为未被按下
        mouse_press = false;
    }

方法三:

 拖拽自定义窗口任意位置移动

转载:http://twyok.blog.163.com/blog/static/81229303201321545850433/

.h文件中

protected:

void mousePressEvent(QMouseEvent *)
void mouseMoveEvent(QMouseEvent* );

private:

QPoint last;//保存鼠标按下的位置

.cpp文件中

第一种写法

void xxxDialog::mousePressEvent(QMouseEvent *e) 
{ 
    last = e->globalPos(); 
} 

void xxxDialog::mouseMoveEvent(QMouseEvent *e) 
{ 
    if(e->buttons()== Qt::LeftButton) 
    { 
        QPoint newpos = e->globalPos(); 
        QPoint upleft = mapToParent(newpos - last); //计算距原位置的偏移
        move(upleft); 
        last = newpos; //更新原位置到最新的位置
    } 
} 
这时已经可以用鼠标手动窗口到任意位置。                    

第二种写法:

 1 void QxxxDlg::mousePressEvent(QMouseEvent *e)
 2 {
 3     if (e->button() == Qt::RightButton)
 4     {
 5         //右键关闭窗口
 6         close();
 7     }
 8 
 9     else if (e->button() == Qt::LeftButton)
10     {
11         //求坐标差,当前鼠标坐标 - 窗口左上角坐标
12         //frameGeometry返回窗口的矩形坐标, topLeft返回窗口左上角点的坐标
13         //move_point = e->globalPos() - this->frameGeometry().topLeft();
14         move_point = e->globalPos() - this->pos();
15     }
16 }
17 
18 void QxxxDlg::mouseMoveEvent(QMouseEvent *e)
19 {
20     if (e->buttons() & Qt::LeftButton)
21     {
22         move(e->globalPos()-move_point);
23     }
24 }
原文地址:https://www.cnblogs.com/chechen/p/5597254.html