QT实现可拖动自定义控件

科技资讯 投稿 5300 0 评论

QT实现可拖动自定义控件

 

#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

 

编程笔记 » QT实现可拖动自定义控件

赞同 (20) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽