美文网首页
qt 自定义拖动窗口

qt 自定义拖动窗口

作者: suriko | 来源:发表于2020-03-22 14:28 被阅读0次

    实现在一个窗口内随意拖动一个控件功能

    • 头文件 MyDragWidget.h
    #ifndef MYDRAGWIDGET_H
    #define MYDRAGWIDGET_H
    
    #include <QWidget>
    
    class MyDragWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit MyDragWidget(PointInfo ptInfo,QWidget *parent = nullptr);
        void mousePressEvent(QMouseEvent *event) override;
        void mouseMoveEvent(QMouseEvent *event) override;
        void mouseReleaseEvent(QMouseEvent *event) override;
    
    signals:
    
    public slots:
    
    private:
        void user_drag_out_disposal();
    
    private:
        QPoint m_mouse_point;
        QPoint m_widget_point;
        bool m_bMove;
    
    private:
        QWidget* m_Parent;
    };
    
    #endif // MYDRAGWIDGET_H
    
    • 源文件 MyDragWidget.cpp
    #include "MyDragWidget.h"
    
    #include <QMouseEvent>
    #include <QVBoxLayout>
    
    
    MyDragWidget::MyDragWidget(PointInfo ptInfo, QWidget *parent) : QWidget(parent)/*, m_point_info(ptInfo)*/
    {
        if(parent)
            m_Parent = parent;
    
        m_bMove = false;
    }
    
    void MyDragWidget::mousePressEvent(QMouseEvent *event)
    {
        if(event->button() == Qt::LeftButton)
        {
            m_bMove = true;
            m_mouse_point = event->globalPos();                 // 鼠标世界坐标
            m_widget_point = this->frameGeometry().topLeft();   // 窗口世界坐标
        }
    }
    
    void MyDragWidget::mouseMoveEvent(QMouseEvent *event)
    {
        if(event->buttons() & Qt::LeftButton)
        {
            QPoint pt = event->globalPos() - m_mouse_point;
            this->move(m_widget_point + pt);
            user_drag_out_disposal();
        }
    }
    
    void MyDragWidget::mouseReleaseEvent(QMouseEvent *event)
    {
        if(event->button() == Qt::LeftButton)
            m_bMove = false;
    }
    
    void MyDragWidget::user_drag_out_disposal()
    {
        int width = m_Parent->width() - this->width();
        int height = m_Parent->height() - this->height();
    
        int x = this->x();
        int y = this->y();
    
        if(m_Parent)
        {
            if(x <= 0)
            {
                if(y <= 0)
                {
                    QPoint pt(0, 0);
                    this->move(pt);
                }
                else if( y > 0 && y < height)
                {
                    QPoint pt(0, y);
                    this->move(pt);
                }
                else if(y >= height)
                {
                    QPoint pt(0, height);
                    this->move(pt);
                }
            }
            else if( x > 0 && x < width )
            {
                if(y <= 0)
                {
                    QPoint pt(x, 0);
                    this->move(pt);
                }
                else if( y > 0 && y < height)
                {
                    QPoint pt(x, y);
                    this->move(pt);
                }
                else if(y >= height)
                {
                    QPoint pt(x, height);
                    this->move(pt);
                }
            }
            else if( x >= width)
            {
                if(y <= 0)
                {
                    QPoint pt(width, 0);
                    this->move(pt);
                }
                else if( y > 0 && y < height)
                {
                    QPoint pt(width, y);
                    this->move(pt);
                }
                else if(y >= height)
                {
                    QPoint pt(width, height);
                    this->move(pt);
                }
            }
        }
    
    }
    
    • main文件 main.cpp
    #include "MyWidget.h"
    
    #include <QApplication>
    #include <QVBoxLayout>
    #include <QLabel>
    
    
    #include "MyDragWidget.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QWidget w;
        QLabel* label = new QLabel(&w);
        label->resize(800, 600);
    
        MyDragWidget mw(pt, label);
        mw.setGeometry(30, 30, 80, 100);
    
        mw.setStyleSheet("border:1px solid #FF00FF;border-radius:5px;");
        mw.setStyleSheet("background:#642100;");
    
        w.show();
        return a.exec();
    }
    
    

    相关文章

      网友评论

          本文标题:qt 自定义拖动窗口

          本文链接:https://www.haomeiwen.com/subject/rxkqjhtx.html