zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    如何使不同时区的时间与京8区一致?(JS实现)
    再论递归
    如何实现keep-alive
    [小tips]使用vscode,根据vue模板文件生成代码
    gulp-load-task 解决 gulpfile.js 过大的问题
    《Vue 编程房内考》
    前端开发笔试题汇总
    HTTP状态码及其含义 503 500 401 200 301 302
    IE, FF, Safari前端开发常用调试工具
    DOCTYPE与浏览器模式详解(标准模式&混杂模式)
  • 原文地址:https://www.cnblogs.com/chechen/p/5597254.html
Copyright © 2011-2022 走看看