一、效果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