• QT实现可拖动自定义控件


    使用QT实现自定义类卡牌控件Card,使其能在父类窗口上使用鼠标进行拖动。

     

     

    控件类头文件card.h

    复制代码
    #ifndef CARD_H
    #define CARD_H
    
    #include 
    #include 
    #include 
    #include 
    
    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类的控件类;

    父窗口头文件mainwindow.h

    复制代码
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include 
    #include "card.h"
    #include 
    
    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();
    }
    复制代码

    以下是工程源码:

    链接:https://pan.baidu.com/s/1YH95FzZV7_idanob2qeHig
    提取码:wbsy

     

  • 相关阅读:
    Docker 安装部署 Gitlab 存储路径迁移
    更加高效的为新项目添加 eslint 和 prettier
    Linux常见的物理设备数据备份和负载均衡模式
    Unittest学习笔记
    获取URL参数的两种方法及location对象的各项获取方式
    Simulink与Arduino烧录配置
    JVM 对象的内存布局
    C++编程中常遇见的问题
    【Unity入门计划】利用Cinemachine实现简单的相机跟随&设置相机边界
    医院陪诊系统:改善患者体验的技术创新
  • 原文地址:https://www.cnblogs.com/xionglaichuangyichuang/p/17294378.html