zoukankan      html  css  js  c++  java
  • Qt坐标系以及自定义可移动控件

    1、效果

    黑色这个控件是自定义的,可以在界面拖动

    2、新建控件的Qt类,父类是QWidget,带ui的,Control.h

    #ifndef CONTROL_H
    #define CONTROL_H
    #include <QWidget>
    
    namespace Ui {
    class Control;
    }
    
    class Control : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Control(QWidget *parent = 0);
        ~Control();
        int A1X,A1Y;
        int A2X,A2Y;
        int pressX,pressY;
        int curentX,curentY;
    protected:
        void paintEvent(QPaintEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
        void mousePressEvent(QMouseEvent *event);
    
    private:
        Ui::Control *ui;
    };
    
    #endif // CONTROL_H

    3、Control.cpp

    #include "control.h"
    #include "ui_control.h"
    #include <QDebug>
    #include <QMouseEvent>
    Control::Control(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Control)
    {
        ui->setupUi(this);
        A2X = this->pos().x();
        A2Y = this->pos().y();
    }
    
    Control::~Control()
    {
        delete ui;
    }
    
    void Control::paintEvent(QPaintEvent *event)
    {
    #if 1
        QPalette palette(this->palette());
        palette.setColor(QPalette::Background, Qt::black);
        this->setAutoFillBackground(true);
        this->setPalette(palette);
    #endif
        if(A2X==0 && A2Y==0)
        {
            return;
        }
        this->move(A2X,A2Y);
    }
    
    void Control::mouseMoveEvent(QMouseEvent *event)
    {
        if (event->buttons() == Qt::LeftButton) // 这个if判断只是为了保证是按压鼠标左键移动产生窗体拖动效果
        {
    #if 0
            curentX = event->x();//鼠标点相对当前widget的位置
            curentY = event->y();
    #endif
            curentX = event->globalX();//鼠标点相对整个显示器的位置
            curentY = event->globalY();
            A2X = A1X+curentX-pressX;
            A2Y = A1Y+curentY-pressY;
    #if 0
            qDebug()<< "mouseMoveEvent:" << curentX << curentY;
            qDebug()<< "A2XY:" << A2X << A2Y;
    #endif
            update();
        }
    }
    
    void Control::mousePressEvent(QMouseEvent *event)
    {
        pressX = event->globalX();//鼠标点相对整个显示器的位置
        pressY = event->globalY();
        A1X = this->x();//widget左上角相对程序的位置
        A1Y = this->y();
    #if 0
        int a = event->x();//鼠标点相对当前widget的位置
        int b = event->y();
        int c = this->geometry().x();//widget左上角相对程序的位置
        int d = this->geometry().y();
        qDebug()<< "mousePressEvent:" << pressX << pressY;
        qDebug()<< "A1XY:" << A1X << A1Y;
        qDebug()<< "A1xy:" << A1X << A1Y;
        qDebug()<< "ab:" << a << b;
        qDebug()<< "cd:" << c << d;
    #endif
    }

    4、在main.ui里拖入widget控件,提升为Control,运行,ok

  • 相关阅读:
    点击CheckBox让Gridview控件在编辑与正常状态之间切换
    BMP图片转换为JPEG图片
    ASP.NET截取网页注释行之间的内容
    Mouse点击之后,复制GridView控件的数据行
    Mouse单击高亮GridView数据行
    ASP.NET div信息提示框显示几秒后隐藏
    RDLC报表带搜索与传参数功能演示(ASP.NET MVC)
    ASP.NET MVC应用程序使用axd格式文件
    Nginx通过geo模式实现限速白名单和全局负载均衡
    MySQL 下mysqladmin日常管理命令总结
  • 原文地址:https://www.cnblogs.com/judes/p/11016771.html
Copyright © 2011-2022 走看看