#ifndef CARD_H #define CARD_H #include <QWidget> #include <QPaintEvent> #include <QPainter> #include <QMouseEvent> class Card:public QWidget { Q_OBJECT public: 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; //创建画笔 painter.setRenderHint(QPainter::Antialiasing,true; QBrush brush; //创建笔刷 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; //信号发送该控件地址 }
以上是基于widget类的控件类;
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "card.h" #include <QDebug> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: 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(; }
以下是工程源码:
提取码:wbsy