如何實現(xiàn)可拖動自定義控件
使用QT實現(xiàn)自定義類卡牌控件Card,使其能在父類窗口上使用鼠標進行拖動。

?
?
控件類頭文件card.h

#ifndef CARD_H#define CARD_H#include <QWidget>#include <QPaintEvent>#include <QPainter>#include <QMouseEvent>class Card:public QWidget { ? ?Q_OBJECTpublic: ? ?explicit Card(QWidget *parent = nullptr); ? ?~Card();protected: ? ?void paintEvent(QPaintEvent *event) override; ? ?void mousePressEvent(QMouseEvent *event) override; signals: ? ?void sendSelf(Card *w); };#endif // CARD_H

控件類頭文件card.cpp

#include "card.h"Card::Card(QWidget *parent):QWidget(parent) { ? ?this->setGeometry(0,0,200,400); ? ? ? //設置控件窗口大小 } Card::~Card() { }void Card::paintEvent(QPaintEvent *event) { ? ?QPainter painter(this); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //創(chuàng)建畫筆 ? ?painter.setRenderHint(QPainter::Antialiasing,true); ? ?QBrush brush; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //創(chuàng)建筆刷 ? ?brush.setColor(Qt::yellow); ? ? ? ? ? ? ? ? ? ? ? ? ? //設置筆刷顏色 ? ?brush.setStyle(Qt::SolidPattern); ? ? ? ? ? ? ? ? ? ? ? ?painter.setBrush(brush); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設置畫筆筆刷 ? ?painter.drawRoundedRect(QRectF(5,5,190,390),10,10); ? //繪制圓角矩形并填充 }void Card::mousePressEvent(QMouseEvent *event) { ? ?Q_UNUSED(event); ? ?emit sendSelf(this); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//信號發(fā)送該控件地址 }

以上是基于widget類的控件類;
父窗口頭文件mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include "card.h"#include <QDebug>namespace Ui {class MainWindow; }class MainWindow : public QMainWindow { ? ?Q_OBJECTpublic: ? ?explicit MainWindow(QWidget *parent = 0); ? ?~MainWindow();private: ? ?Ui::MainWindow *ui; ? ?Card* cd[8]; ? ?Card *temp; ? ?QPoint startP; ? ?QPoint yuanP;private slots: ? ?void getObject(Card *w);protected: ? ?void mouseMoveEvent(QMouseEvent *event) override; ? ?void mouseReleaseEvent(QMouseEvent *event) override; };#endif // MAINWINDOW_H

父窗口頭文件mainwindow.cpp

#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) : ? ?QMainWindow(parent), ? ?ui(new Ui::MainWindow) { ? ?ui->setupUi(this); ? ?for(int i=0;i<8;i++) ? ?{ ? ? ? ?cd[i] = new Card(this); ? ? ? ?connect(cd[i],&Card::sendSelf,this,&MainWindow::getObject); ? ? ? ?cd[i]->move(i%4*200,i/4*400+20); ? ?} } MainWindow::~MainWindow() { ? ?delete ui; }//獲取控件坐標void MainWindow::getObject(Card *w) { ? ?temp = w; ? ?startP = cursor().pos()-this->pos(); ? ?yuanP = temp->pos(); ? ?/*將此小部件提升到父小部件堆棧的頂部*/ ? ?temp->raise(); }//移動事件void MainWindow::mouseMoveEvent(QMouseEvent *event) { ? ?temp->move(yuanP.x()+event->x()-startP.x(),yuanP.y()+event->y()-startP.y()); }//拖拽對象置頂,卡牌積壓的時候,拖動的那張卡牌置頂void MainWindow::mouseReleaseEvent(QMouseEvent *event) { ? ?temp->raise(); }