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