正文
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_OBJECTpublic:
explicit Control(QWidget *parent = );
~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== && A2Y==)
{
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