Qt座標系以及自定義可移動控件

一、效果ui

黑色這個控件是自定義的,能夠在界面拖動this

二、新建控件的Qt類,父類是QWidget,帶ui的,Control.hspa

#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

三、Control.cppcode

#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
}

四、在main.ui裏拖入widget控件,提高爲Control,運行,okblog

相關文章
相關標籤/搜索