Qt鼠标拖动控件交换布局位置

这篇具有很好参考价值的文章主要介绍了Qt鼠标拖动控件交换布局位置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

方法很简单,交换鼠标起点控件指针和鼠标落点控件指针的值,然后重新布局

Qt鼠标拖动控件交换布局位置

源文件

#include "widget.h"
#include<QLabel>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setMinimumSize(1000,800);
    //label = new QLabel(this);
    //label->setFixedSize(80,40);
    //label->hide();
    lay = new QGridLayout(this);
    setLayout(lay);
    lay->setSpacing(0);
    //设置表格布局行列为5*5的形式
    for(int i = 0;i <5 ;++i){
        for(int j = 0;j <5 ;++j)
        {
            qDebug() << i*5+j;
            auto label = new QLabel(QString::number(i*5+j+1));
            label->setAlignment(Qt::AlignCenter);
            label->setFont(QFont("宋体",50));
            label->setStyleSheet("border:2px groove gray");
            lay->addWidget(label,i,j,1,1);
            labels.push_back(label);
        }
    }
}
void Widget::reStartLayout()//重新布局
{
    qDebug() << lay->count();
    for(auto&w : labels){
        lay->removeWidget(w);//移除旧布局
    }
    qDebug() << lay->count();
    for(int i = 0;i <5 ;++i){//生成新布局5*5
        for(int j = 0;j <5 ;++j){
            lay->addWidget(labels[i*5+j],i,j,1,1);
        }
    }
    qDebug() << lay->count();
}
int Widget::indexByPos(const QPoint& pos)
{//根据鼠标pos点取索引
    for(int i = 0;i <5 ;++i){
        for(int j = 0;j <5 ;++j){
            if(lay->cellRect(i, j).contains(pos)){
                qDebug() << i*5+j;
                return i*5+j;//Qlabel*索引
            }
        }
    }
    return -1;
}
void Widget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton){
        pressIndex = indexByPos(event->pos());//拖动起点索引
    }
    QWidget::mousePressEvent(event);
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        if(pressIndex!= -1){
            int index = indexByPos(event->pos());//落点索引
            if(index!= -1 && pressIndex!= index){
                std::swap(labels[pressIndex],labels[index]);//交换起点和落点的QLabel指针
                reStartLayout();
            }
            pressIndex = -1;
        }
    }
    QWidget::mouseReleaseEvent(event);
}

头文件

#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void mousePressEvent(QMouseEvent *event) ;
    void mouseReleaseEvent(QMouseEvent *event);
    int indexByPos(const QPoint& pos);
    void reStartLayout();

private:
    QGridLayout* lay;
    std::vector<QLabel*> labels;
    int pressIndex = -1;
    //QPoint move_pos;
    //QLabel* label;
};

下面是只交换控件显示的内容:

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        if(pressIndex!= -1){
            int index = indexByPos(event->pos());//落点索引
            if(index!= -1 && pressIndex!= index){
             QString str1 = labels[pressIndex]->text();
             QString str2 = labels[index]->text();
                  labels[pressIndex]->setText(str2);
                  labels[index]->setText(str1);
            }
        }
    }
    QWidget::mouseReleaseEvent(event);
}

添加鼠标贴图,跟随鼠标移动:
一种实现:重写void paintEvent(QPaintEvent *event);方法

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        if(pressIndex!= -1){
            int index = indexByPos(event->pos());//落点索引
            if(index!= -1 && pressIndex!= index){
                std::swap(labels[pressIndex],labels[index]);//交换起点和落点的QLabel指针
                reStartLayout();
            }
            pressIndex = -1;
            repaint();//立即执行paintEvent方法
        }
    }
    QWidget::mouseReleaseEvent(event);
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{

    if (event->buttons() & Qt::LeftButton) {
        if(pressIndex!= -1){
         move_pos =  event->pos();
         repaint();
        }
    }
    QWidget::mouseReleaseEvent(event);

}

void Widget::paintEvent(QPaintEvent *event)
{
    if(pressIndex!= -1){
        QPainter painter(this);
        QPen pen; //画笔。绘制图形边线,由颜色、宽度、线风格等参数组成
        pen.setColor(QColor(0,0,255));
        painter.setPen(pen);
        painter.setBrush(QColor(79 ,79 ,79));
        painter.setRenderHint(QPainter::Antialiasing);
       // qDebug()<< event->pos().x() <<"y " << event->pos().y();
        painter.drawRect(move_pos.x()-40,move_pos.y(),80,40);
        painter.drawText(move_pos.x(),move_pos.y()+30,QString::number(pressIndex));
    }
}

另一种实现:文章来源地址https://www.toymoban.com/news/detail-516029.html

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        if(pressIndex!= -1){
            int index = indexByPos(event->pos());//落点索引
            if(index!= -1 && pressIndex!= index){
                std::swap(labels[pressIndex],labels[index]);//交换起点和落点的QLabel指针
                reStartLayout();
            }
            pressIndex = -1;
            if(label->isVisible())
               label->hide();
        }
    }
    QWidget::mouseReleaseEvent(event);
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{

    if (event->buttons() & Qt::LeftButton) {
        if(pressIndex!= -1){
            if(!label->isVisible())
                label->show();
         QPicture p;
         p.setBoundingRect(QRect(event->pos().x()-40,event->pos().y(),80,40));
         QPainter painter(&p);
         painter.setPen(Qt::green);
         painter.setBrush(QColor(79 ,79 ,79));
         painter.drawRect(QRect(event->pos().x()-40,event->pos().y(),80-1,40-1));
         painter.drawText(event->pos().x(),event->pos().y()+30,QString::number(pressIndex));
         label->move(event->pos().x()-40,event->pos().y());
         label->setPicture(p);
        }
    }
    QWidget::mouseReleaseEvent(event);
}

到了这里,关于Qt鼠标拖动控件交换布局位置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT编写实现图片的幻灯片播放、自适应显示、缩放(以鼠标位置为中心进行缩放)、拖动、重置、显示鼠标位置像素坐标及RGB值、播放GIF动画、截图保存、批量保存、拖入文件夹遍历所有文件

    这个图片查看器功能很多,是我花了不少心思,不断优化,不断添加功能的成果: 1.能打开并显示所有常用图片格式文件,显示鼠标位置像素坐标及RGB值 2.能缩放,拖动图片,可以以鼠标为中心滚动滚轮进行缩放 3.右击可弹出菜单栏,菜单包括:适应宽度,适应窗口,原图大

    2024年02月10日
    浏览(46)
  • django boostrap html实现可拖拽的左右布局,鼠标拖动调整左右布局的大小或占比

          最近需要在Django项目中,实现一个左右布局的html页面,页面框架使用的是boostrap。但这个布局不是简单的左右分栏布局,而是需要实现可以通过鼠标拖拽的方式动态调整左右两侧布局的大小和占比。效果大致如下:         一开始,页面分为左右两块布局:   鼠标放

    2024年02月13日
    浏览(30)
  • Qt:界面实时响应鼠标拖动绘制

    采用双缓冲实现界面实时响应鼠标的拖动绘制。 思想如下:首先需要两张画布pix和tempPix,他们都是QPixmap实例;pix用来保存初始界面或上一阶段以完成的绘制;tempPix用来作为鼠标拖动时的实时界面绘制;当鼠标左键按下后拖动时每次都将将pix赋值给tempPix,然后用tempPix进行绘

    2024年02月11日
    浏览(26)
  • 【[Qt]基于QChartView开发的图表显示控件,支持实时显示,动态更新,支持鼠标交互等操作】

    十字线和显示坐标实现 在.h文件中定义十字线lineitem变量和坐标textitem变量 在Cpp文件中初始化 然后定义鼠标事件,在鼠标进入时显示,移出时隐藏,移动时显示。 其他实现请参考具体代码 ChartDrawer.h文件 ChartDrawer.cpp 文件 具体使用代码如下 1、初始化类对象,并加入界面布局

    2023年04月23日
    浏览(30)
  • 【Qt】Qt无边框窗口(鼠标点击自定义标题栏)可拖动

    隐藏掉标题栏后,默认情况下窗口无法被鼠标拖动的,需要自己处理鼠标事件,移动窗口达到拖动效果,但是又不想要鼠标点击整个窗口都可以拖动,只需要鼠标点击自定义的标题栏时可拖动 具体步骤如下: 类外初始化 通过鼠标点击事件,判断鼠标是否在标题栏,如果是,

    2024年02月12日
    浏览(29)
  • Qt鼠标拖动绘制基本几何图形

    用Qt鼠标事件实现基本几何图形的绘制,支持直线、矩形、圆形、椭圆。后期可以在此基础上进行扩展。 效果图 实现 本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独的对象,鼠标拖动绘制的过程是在临时层中完成,release后生成一个矢量的图

    2024年02月13日
    浏览(27)
  • Qt布局管理(布局控件)

    实际开发中,一个界面上可能包含十几个控件,手动调整它们的位置既费时又费力。作为一款成熟的 GUI 框架,Qt 提供了很多摆放控件的辅助工具(又称布局管理器或者布局控件),它们可以完成两件事: 自动调整控件的位置,包括控件之间的间距、对齐等; 当用户调整窗口

    2024年02月04日
    浏览(31)
  • QT QChartView 鼠标随动 十字线 缩放 平移 拖动

    QChart添加跟随鼠标的十字线_x县豆瓣酱的博客-CSDN博客_qchart鼠标跟踪线 最近在做这么一个东西,需要十字线。我参考自上面的博主的内容,但是他没写全。很多人不知道这个QGraphicsLineItem 是怎么创建的,然后x_line 和y_line 是如何弄到chartview 的Scene中的。 下面试我的效果,实现

    2024年02月12日
    浏览(30)
  • Qt - 控件和布局

    https://www.bilibili.com/video/BV1g4411H78N?p=6 添加控件到窗口,需要添加内容到 mywidget.cpp 按钮控件常用API 创建 QPushButton * btn = new QPushButton 设置父亲 setParent(this) 设置文本 setText(\\\"文字\\\") 设置位置 move(宽,高) 重新指定窗口大小 resize 设置窗口标题 setWindowTitle 设置窗口固定大小 setFixed

    2024年02月16日
    浏览(36)
  • Qt使用代码放置控件并布局

            上一章中我们从头一步一步地新建项目并运行了窗口,本章就正式踏入Qt界面编程之路。在本章节,我们先用代码编写界面,进行简单的控件放置,然后用代码进行布局;之后使用Qt Designer进行控件放置和界面布局,这使得复杂界面的设计变得简单起来。      

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包