精华内容
下载资源
问答
  • qt5 鼠标拖拽事件 —— 编程 教学 游戏 demo, 详细看文档https://mp.csdn.net/postedit/81049635; 里面有源代码,ui设计和文档
  • QT5 实现鼠标拖拽事件

    千次阅读 2018-07-15 02:19:09
    先给最终效果:简单的来说就是重写了一下鼠标事件

    先给最终效果:


    简单的来说就是重写了一下鼠标事件:

    void camdWidget::dragEnterEvent(QDragEnterEvent *event)
    {
        toolbox* source = qobject_cast<toolbox*>(
                    event->source());
        if(source != NULL)
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }
        camdWidget* source1 = qobject_cast<camdWidget*>(
                    event->source());
        if(source1 != NULL)
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }
    
    }
    
    void camdWidget::dragMoveEvent(QDragMoveEvent *event)
    {
        toolbox* source = qobject_cast<toolbox*>(
                    event->source());
        if(source != NULL)
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }
        camdWidget* source1 = qobject_cast<camdWidget*>(
                    event->source());
        if(source1 != NULL)
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }
    }
    
    void camdWidget::dropEvent(QDropEvent *event)
    {
        toolbox* source = qobject_cast<toolbox*>(
                    event->source());
        if(source != NULL)
        {
            const QMimeData* data = event->mimeData();
            QString text = data->text();
            addUnit(text);
            event->setDropAction(Qt::MoveAction);
            event->accept();
            return;
        }
    
        camdWidget* source1 = qobject_cast<camdWidget*>(
                    event->source());
        if(source1 != NULL)
        {
            const QMimeData* data = event->mimeData();
            QString index = data->text();
    
            if(!r->is_item_recy(index.toInt())) return;
            event->setDropAction(Qt::MoveAction);
            event->accept();
            if(lastPoints.length()<1) return;
            ptr_P end = new P();
            end->p = QPoint(event->pos());
            end->num = (end->p.y()-10)/40;
            endPoints.append(end);
            qDebug()<<"[99]last length"<<lastPoints.length()<<"end length"<<endPoints.length();
    
            ptr_P tmp = lastPoints.back();
            qDebug()<<"连接"<<tmp->num<<end->num;
            r->set_re(tmp->num, end->num);
            update();
        }
    }
    
    void camdWidget::mousePressEvent(QMouseEvent *event){
        unit *child = static_cast<unit*>(childAt(event->pos()));
    //    qDebug()<< child->objectName();
        if (!child) return;
        QStringList text_index = child->objectName().split('_');
    //    qDebug()<<"press:"<<r->is_item_recy(text_index.back().toInt());
        if(r->is_item_recy(text_index.back().toInt())){
            beginPos = event->pos();
            ptr_P last = new P();
            last->p = QPoint(event->pos());
            last->num = (last->p.y()-10)/40;
            append_lastPoints(last);
            qDebug()<<"[169]last length"<<lastPoints.length()<<"end length"<<endPoints.length();
        }
    }
    
    void camdWidget::mouseMoveEvent(QMouseEvent *e)
    {
        unit *child = static_cast<unit*>(childAt(beginPos));
        if(!child) return;
        QString childName = child->objectName();
    
        if(e->buttons() & Qt::LeftButton)
        {
            QStringList text_index = childName.split('_');
            QString index = text_index.back();
    //        qDebug()<< child->objectName()<<r->is_item_recy(index.toInt());
            if(r->is_item_recy(index.toInt())){
                if((e->pos() - beginPos).manhattanLength() >= QApplication::startDragDistance()){
                    QMimeData *mimeData = new QMimeData;
                    mimeData->setText(index);
                    QDrag *drag = new QDrag(this);
                    drag->setMimeData(mimeData);
                    drag->exec(Qt::MoveAction);
                }//if
            }
        }//if
    }
    
    void camdWidget::paintEvent(QPaintEvent *)
    {
        QPainter pp(this);
        QPen pen;                                 //创建一个画笔
        pen.setColor(Qt::yellow);
        pen.setWidth(2);
        pp.setPen(pen);
    
        for(int i = 0; i<lastPoints.length()&& lastPoints.length() == endPoints.length(); i++){
            QPoint extension = lastPoints[i]->p+QPoint(70,0);
            QPoint y_extension = QPoint(extension.x(),endPoints[i]->p.y());
            pp.drawLine(lastPoints[i]->p, extension);
            pp.drawLine(extension, y_extension);
            pp.drawLine(endPoints[i]->p, y_extension);
        }
    }

    整个效果就是:

    选择模式界面:


    循环判断界面:


    条件判断界面:


    本项目的(源代码+UI+mac 安装包+ 文档)的下载地址:https://download.csdn.net/download/iwanaabigdrumstick/10541943



    展开全文
  • QT拖拽事件

    2021-06-01 19:39:56
    //拖拽进入事件 void GLWidget::dragEnterEvent(QDragEnterEvent *event) { if(!event->mimeData()->urls()[0].fileName().right(3).compare("jpg") || !event->mimeData()->urls()[0].fileName()....

    直接看代码,就3个事件(我这里是推动文件得到路径例子)

    //拖拽进入事件
    void GLWidget::dragEnterEvent(QDragEnterEvent *event)
    {
        if(!event->mimeData()->urls()[0].fileName().right(3).compare("jpg")  || !event->mimeData()->urls()[0].fileName().right(3).compare("png") ||
           !event->mimeData()->urls()[0].fileName().right(4).compare("jpeg") || !event->mimeData()->urls()[0].fileName().right(3).compare("bmp")){
            event->acceptProposedAction();
        }
        else{
            event->ignore();//否则不接受鼠标事件
        }
    }
    //拖拽移动事件
    void GLWidget::dragMoveEvent(QDragMoveEvent *event)
    {
        Q_UNUSED(event);
        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
    
    //拖拽放下事件
    void GLWidget::dropEvent(QDropEvent *event)
    {
    
        const QMimeData *qm=event->mimeData();//获取MIMEData
        const QString Path = qm->urls()[0].toLocalFile();//是获取拖动文件的本地路径。
        emit dropPic(Path);
    }
    

    其中,一般没有中间的drapMoveEvent事件就能达到效果

    但是,我试过QGLWidget这个类里面只重写了dragEnterEvent和dropEvent事件,发现dropEvent事件压根就没进去(不懂为什么)

    解决办法:像我那样写个dragMoveEvent事件就好了(也不太懂)

    还望各位大佬解答【不管对错,有想法都可以留言】

    展开全文
  • QT拖动界面的鼠标事件

    千次阅读 2019-06-01 13:11:47
    在我们设计自定义QT界面时,一般会取消界面最上面的拖动控件,为此我们需要新的界面添加鼠标拖动事件。 (1).在.h文件的类中声明函数 void mousePressEvent(QMouseEvent* event); void mouseMoveEvent...

    在我们设计自定义QT界面时,一般会取消界面最上面的拖动控件,为此我们需要新的界面添加鼠标拖动事件。

    (1).在.h文件的类中声明函数

        void mousePressEvent(QMouseEvent* event);
        void mouseMoveEvent(QMouseEvent* event);
        QPoint last_mouse_position_;

    (2).在.cpp文件中添加头文件

    #include <QMouseEvent>

    (3).在.cpp文件中补充函数内容

    void MainWindow::mousePressEvent(QMouseEvent *event)
    {
        if (event->button() == Qt::LeftButton)
            last_mouse_position_ = event->globalPos();
    }
    
    void MainWindow::mouseMoveEvent(QMouseEvent *event)
    {
        if (!event->buttons().testFlag(Qt::LeftButton))
                return;
        const QPoint position = pos() + event->globalPos()-last_mouse_position_;
        move(position.x(), position.y());
        last_mouse_position_ = event->globalPos();
    }
    

     

    展开全文
  • 功能: 鼠标按住窗口的自定义标题栏后,移动拖动整个窗口功能 实现方式: 方法一:其中CVideoPlayerApp是自定义标题栏的QWidget。 void CVideoPlayerApp::mousePressEvent(QMouseEvent *event) { if (event->...

     

    功能: 鼠标按住窗口的自定义标题栏后,移动拖动整个窗口功能

    实现方式:

    方法一:其中CVideoPlayerApp是自定义标题栏的QWidget。

    void CVideoPlayerApp::mousePressEvent(QMouseEvent *event)
    {
    	if (event->button() == Qt::LeftButton)
    	{
    		if (event->y() < VALUE_DIS || event->x() < VALUE_DIS || rect().width() - event->x() < VALUE_DIS)
    		{
    			event->ignore();
    			return;
    		}
    		m_ptPress = event->globalPos();
    		m_bLeftButtonPress = true;
    	}
    	event->ignore();
    }
    
    void CVideoPlayerApp::mouseMoveEvent(QMouseEvent *event)
    {
    	
    	if (m_bLeftButtonPress)
    	{
    		m_ptMove = event->globalPos();
    		int x = (m_ptMove - m_ptPress).x();
    		int y = (m_ptMove - m_ptPress).y();
    		emit sigMouseMoveEvent(x, y);  //触发对应的槽函数,移动窗口
    		m_ptPress = m_ptMove;
    	}
    	event->ignore();
    }
    
    void CVideoPlayerApp::mouseReleaseEvent(QMouseEvent *event)
    {
    	if (event->button() == Qt::LeftButton)
    	{
    		m_bLeftButtonPress = false;
    	}
    	event->ignore();
    }
    void CVideoPlayerApp::slotMouseMoveEvent( int x, int y )
    {
    	move(this->pos().x() + x, this->pos().y() + y);
    
    	// 更新窗口位置
    	updateWindowsPos();
    }

    方法二:其中MarkBuildDrawWgt就是一个含有自定义标题栏的QWidget。

    void MarkBuildDrawWgt::mousePressEvent(QMouseEvent *event)
    {
    	if (event->button()==Qt::LeftButton && ui.frameMarkBuildDarwTitle->underMouse())
    	{
    		m_bPress = true ;
    		m_lastPoint = event->pos(); //相对坐标
    	}
    	QWidget::mousePressEvent(event);
    }
    void MarkBuildDrawWgt::mouseMoveEvent(QMouseEvent *event)
    {
    	if (m_bPress)
    	{
    		this->move(pos()+(event->pos()-m_lastPoint));
    	}
    	QWidget::mouseMoveEvent(event);
    }
    void MarkBuildDrawWgt::mouseReleaseEvent(QMouseEvent *event)
    {
    	
    	m_bPress = false ;
    	QWidget::mouseReleaseEvent(event);
    	
    }

     方法二思路:  鼠标按下事件中监听是否为鼠标左键,并且是否在自定义标题内 -->  记录下按下的相对坐标位置,并记录按下的状态(bool)。

            鼠标移动事件中监听是否正处于按下状态  --》 计算当前鼠标相对位置 -  按下的相对坐标位置  --》 移动窗口相应的距离  --》更新按下的相对坐标位置。

    【问题】方法二中为什么相对坐标可以,感觉都是窗口move结束和开始的差值。为什么方法一中,需要不断更新上一个点的坐标?而方法二却不用?

      假设,鼠标按下的点是子窗口的左上角的点,也就是(0,0)。那么但鼠标向左在移动10px后,其鼠标相对子窗口而言是(-10,0)。然后子窗口向左移动10px后,这个过程中,鼠标移动只有这一次执行move() ,而不是1px1px的执行。

    然后当再次执行时候,鼠标向下移动10px的时候,其还是(0,10)而不是(-10,10)。这里就是关键,第二次执行event->pos()的时候,其减去的那个按下的点相对坐标没边,但其绝对坐标其实已经改变了,这就是为什么相对坐标可以直接相减,而不用在对按下点重新赋值。而用绝对路径的方法时,如果还用按下的点的绝对坐标为准,那么第二次计算的时候,如果把第一次窗口移动会原来的位置就每错了。

    另一个关键点: 无法方法一还是二的,其MouseMoveEvent()其不要看成连续的,看出是间段的理解就好了

    其实可以用向量的方法来理解。

    【问题】这个与Mouse Tracking有关系吗?我没有设置这个也可以正常运行。

    如果想触发mouseMoveEvent()这个鼠标移动的响应函数,则必须要设置窗体(或控件)是可以Mouse Tracking的,不然程序不会进入mouseMoveEvent()函数。

    [QT]获取鼠标坐标以及按键响应

     

    【注意】从实现效果上来看,用复杂的子窗口,他在移动的时候,会出现拖尾重影的效果,无论是用相对还是全局坐标

     

     

     

     

     

    qt开发之获取鼠标的相对位置和绝对位置

    相对坐标: 相对于当前MousePressEvent的窗口而已,即子窗口。

    绝对坐标: 相对于桌面而已的坐标。

     

     

     

     

     

     

     

    展开全文
  • windows平台下的Qt界面开发中,使列表控件中的项目可以通过鼠标拖拽,改变列表中Item项目的排序,资源通过网络上的教程资源整合,不得商用。
  • Qt中实现鼠标拖动窗口可以分为三个步骤来做: 鼠标在窗口按下左键时,获取到当前鼠标的位置,并且计算offset,即鼠标当前位置减去窗口左上角坐标; 鼠标移动时,因为是单击鼠标,所以会一直执行第一步,获取到...
  • QT拖拽事件顺序问题

    2020-07-04 18:06:41
    需求:从右边拖动一个按钮到左边,然后生成一个对应...这样的效果显然不是我们想要的,于是查了下Qt的帮助文档,增加一句代码: ui->widget->layout()->setAlignment(Qt::AlignTop); 效果如下: ...
  • QT实现鼠标拖拽Label

    2021-07-14 20:34:24
    } //鼠标按下时执行的事件处理函数 void MouseDialog::mousePressEvent(QMouseEvent *event) { //是否为鼠标左键按下 if(event->button() == Qt::LeftButton){ //获取label所在矩形区域 QRect rect = ui->label->...
  • Qt控件拖拽最简实践

    2018-11-28 10:35:52
    Qt拖拽的基本实践,从QListWidget上拖动一个Item,拖的过程中绘制矩形框,拖到目标Widget中,创建Button,该Button在Widget内部可随意拖动;...这个例子主要是理解Qt拖拽事件怎么使用,事件怎么被接受,数据怎么传递
  • Qt 鼠标拖动缩放

    热门讨论 2013-10-08 21:20:35
    Qt drag和drop基础上,实现QGraphicsItem的鼠标拖动缩放
  • Qt拖拽事件小结

    千次阅读 2016-02-15 16:04:22
    Qt拖拽事件可以通过帮助里面的几个例子可以很好的理解。 这里拿前段时间遇到的一个问题来讲解一下对于拖拽事件的以及Qt部件的一些理解。 左侧有两个QTextEdit,右侧是一个QListWidget,里面列举了一些...
  • Qt拖拽打开文件

    2016-11-13 01:50:30
    Qt实现:通过鼠标拖拽,打开文本文件 详细内容,参见博客“Qt: QDropEvent拖拽事件,拖拽打开文件”(http://blog.csdn.net/rl529014/article/details/53057577)
  • Qt鼠标事件,窗口移动

    千次阅读 2019-06-11 22:31:10
    //记录鼠标左键按下时窗口和鼠标的位置偏差 }; #endif // MAINWINDOW_H mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include #include MainWindow::MainWindow(QWidget *parent)...
  • label显示边框 ui -> label_14 -> setStyleSheet("border:1px solid black;"); 鼠标点击移动事件 //mainwindow.h中添加头文件 #include <QMouseEvent>...//添加点击事件指针 ...//鼠标移动事件
  • QT鼠标拖拽功能简介

    千次阅读 2013-11-11 11:07:55
    第一个例子用来说明一个Qt应用程序接受另一个程序触发的拖动事件。该Qt应用程序是一个QTextEdit为中央控件的主窗口。当用户从桌面或者一个文件浏览器中拖动一个文本文件到Qt程序时松开,程序把文件显示在QTextEdit...
  • 1、鼠标拖拽(drag&drop)QGraphicsItem 实现方法,继承QGraphicsItem,重载鼠标按下、移动、释放事件处理函数 class ColorItem : public QGraphicsItem {... protected: void mousePressEvent...
  • 该篇作为学习Qt事件系统的前导篇,主要介绍最常见的三个事件的使用。 鼠标事件 参考文档:Drag and Drop 参考例程:Draggable Text Example 、 Draggable Icons Example 鼠标移动事件只会在按下鼠标按键的情况下才会...
  • Qt移动窗体之鼠标事件的重写

    千次阅读 2018-11-06 11:57:30
    在使用Qt开发界面时往往会涉及使用鼠标拖动窗体,鼠标可以直接按住窗体边框拖动,当鼠标按住窗体内部拖动时就需要重写鼠标事件。 重写鼠标事件来移动窗体的思路有两种 第一种:移动位置=(鼠标移动位置)-(鼠标相...
  • 重写事件例子具体演示效果   滑动滚轮可以使矩形区域改变,使用的是滚轮滚动事件和画图事件如下图   使用鼠标的点击滑动和释放三个响应事件可以画出任意大小...使用鼠标进入事件和离开事件改变鼠标样式进入是手型鼠标
  • QMouseEvent类表示一个鼠标事件,窗口中的按下,移动都会产生鼠标事件。 QWheelEvent用来表示滚轮事件,获取滚轮的移动方向和距离。 本案例效果:在文本框与框外鼠标样式改变,双击全屏,右击样式改变滑轮缩放文本...
  • QT拖拽事件分析

    2021-01-21 11:42:47
    QT拖拽流程与源码解析 https://blog.csdn.net/hjing1988/article/details/42131617 qt拖拽内部调用的是windows的阻塞函数 DoDragDrop DoDragDrop 方法的使用: ...
  • Qt鼠标事件实现基本几何图形的绘制,支持直线、矩形、圆形、椭圆。后期可以在此基础上进行扩展。使用QGraphics完成。 博客地址:https://blog.csdn.net/luoyayun361/article/details/93890331
  • Qt: QDropEvent拖拽事件,拖拽打开文件

    万次阅读 2016-11-06 23:24:08
    Qt: QDropEvent拖拽事件,拖拽打开文件
  • 潘驴邓小闲出品必属精品 Qt窗体鼠标拖动放大缩小
  • pyqt5——拖拽

    2020-12-10 03:34:39
    拖拽在GUI里,拖放是指用户点击一个虚拟的对象,拖动,然后放置到另外一个对象上面的动作。一般情况下,需要调用很多动作和方法,创建很多变量。拖放能让用户很直观的操作很复杂的逻辑。一般情况下,我们可以拖放两...
  • Qt鼠标拖动绘制基本几何图形

    千次阅读 热门讨论 2019-06-27 18:58:08
    Qt鼠标事件实现基本几何图形的绘制,支持直线、矩形、圆形、椭圆。后期可以在此基础上进行扩展。 效果图 实现 本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独的对象,鼠标拖动...
  • Qt控件拖拽事件

    万次阅读 2011-06-24 00:21:00
    http://yamcot.com/qt-drag-drop-event.htmlQt控件拖拽事件By flyingpig on 2010/06/06 699 Views | Go to Comments (1) 因为编辑器需要在不同的控件之间支持拖拽操作,所以对Qt的拖拽研究了一下. 这里实现一种比较...
  • Qt事件处理-鼠标事件

    2021-11-11 08:54:38
    键盘事件定义于qwidget类,描述鼠标事件. void mousePressEvent(QMouseEvent* event);//鼠标按下 void mouseReleaseEvent(QMouseEvent* event);//鼠标抬起 void mouseDoubleClickEvent(QMouseEvent* event);//鼠标...
  • qt widget控件拖放示例

    2019-02-25 22:13:43
    实现qt widget控件的拖放功能,并且有鼠标拖动过程控件截图

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,135
精华内容 1,254
关键字:

qt鼠标拖拽事件