• 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

     

  • 相关阅读:
    【SA8295P 源码分析 (一)】54 - /ifs/bin/startupmgr 程序工作流程分析 及 script.c 介绍
    Android AIDL跨进程通信基础(多端情况)
    hdfs shell操作助记总结
    Hive中Join优化的几种算法
    vue中基础组件间通信(父子,子父,跨两级通信)
    C语言青蛙爬井(ZZULIOJ1072:青蛙爬井)
    用户 + 案例 + 认证 + 框架一键ko,不愧是阿里最新 Spring Security 全栈笔记
    Shopee位列巴西电商应用访问量排名第一
    【python3】6.pickle json 序列化
    腾讯云部署----DevOps
  • 原文地址:https://www.cnblogs.com/xionglaichuangyichuang/p/17294378.html