网站建设 东阿阿胶,网站点击量 哪里查询,网站开发常用的开发工具,网站开发注册流程以及收费本文章从属于  Qt实验室-CSDN博客系列 
拖放操作包括两个动作#xff1a;拖动(drag)和放下(drop或称为放置)。 
拖动允许 
对于要拖出的窗口或控件#xff0c;要setDragEnabled(true) 
对于要拖入的窗口或控件#xff0c;要setAcceptDrops(true) 
下面以一个具体的用例进行说…本文章从属于  Qt实验室-CSDN博客系列 
拖放操作包括两个动作拖动(drag)和放下(drop或称为放置)。 
拖动允许 
对于要拖出的窗口或控件要setDragEnabled(true) 
对于要拖入的窗口或控件要setAcceptDrops(true) 
下面以一个具体的用例进行说明 
拖动列表控件中的项目 
该用例实现从左边的列表窗口拖出到右边的Widget窗口拖入 
主界面设置 
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{this-resize(1200,800);//从ProjectListWidget拖动到MyWidget上QSplitter* centernew QSplitter;center-addWidget(new ProjectListWidget);center-addWidget(new MyWidget);center-setOrientation(Qt::Horizontal);this-setCentralWidget(center);
}左侧列表窗口设置 
class ProjectListWidget : public QListWidget
{Q_OBJECT
public:ProjectListWidget();// QAbstractItemView interface
protected:void startDrag(Qt::DropActions supportedActions);
}; 左侧窗口允许拖动其item并且将item中的文字存入QMimeData用以传输到右侧窗体中 ProjectListWidget::ProjectListWidget()
{this-addItem(item1);this-addItem(item2);//(1)开启允许拖动如果不开启是不会有拖动item移动的效果的this-setDragEnabled(true);
}//(2)开始拖动设置了一种标记为x1的拖动数据
void ProjectListWidget::startDrag(Qt::DropActions supportedActions)
{QString textthis-currentItem()-text();QMimeData* mimeDatanew QMimeData;mimeData-setData(x1,text.toLocal8Bit());QDrag* dragnew QDrag(this);drag-setMimeData(mimeData);drag-exec();
} 右侧窗体的实现会多些首先必须允许拖拽进入事件dragEnterEvent然后必须允许拖拽移动事件dragMoveEvent。最后实现dropEvent来接收数据。 MyWidget::MyWidget(QWidget *parent): QWidget{parent}
{//(1)开启允许放置如果不开启拖动进入界面时将显示禁止符号this-setAcceptDrops(true);
}//2实现了以下两个方法后该界面就能允许拖拽进入了
//对一种被标记为x1的拖动数据允许拖拽进入
void MyWidget::dragEnterEvent(QDragEnterEvent *event)
{if (event-mimeData()-hasFormat(x1))event-accept();elseevent-ignore();
}void MyWidget::dragMoveEvent(QDragMoveEvent *event)
{if (event-mimeData()-hasFormat(x1))event-accept();elseevent-ignore();
}//3实现dropEvent来接收拖动携带的数据
void MyWidget::dropEvent(QDropEvent *event)
{if (event-mimeData()-hasFormat(x1)){QString text(event-mimeData()-data(x1));QPoint posevent-pos();//在这里将拖动过来的数据放入list,然后通过paintEvent()进行绘制m_textList.append({text,pos});event-accept();this-update();}elseevent-ignore();
}void MyWidget::paintEvent(QPaintEvent *event)
{QPainter painter(this);for(int i0;im_textList.size();i){QPoint posm_textList.at(i).second;QString textm_textList.at(i).first;painter.drawText(pos,text);}
}最终的效果如下 事件发出顺序和传递规则 上图参考自 Qt拖放(1)拖放基本原理(QDrag类)-CSDN博客 关于 QDrag.exec() 
void ProjectListWidget::startDrag(Qt::DropActions supportedActions)
{//调用该方法的时机点击item并移动鼠标即进入该方法//然后执行到drag-exec()阻塞//exec()函数是一个阻塞函数(但不会阻塞主事件循环)//也就是说在松开鼠标之前不会打印after drag//但是窗口依然可以得到其他的事件响应例如mainwindow依然可以响应QTimer触发的update()QString textthis-currentItem()-text();QMimeData* mimeDatanew QMimeData;mimeData-setData(x1,text.toLocal8Bit());QDrag* dragnew QDrag(this);drag-setMimeData(mimeData);qDebug()before drag;drag-exec();qDebug()after drag;
}MainWindow中构造时添加如下代码  QTimer* timernew QTimer(this);timer-setInterval(1000);connect(timer,QTimer::timeout,[]{qDebug()update...;this-update();});timer-start(); 测试在拖拽中不释放鼠标时主窗口能否响应其他的事件是可以的 
bool MainWindow::event(QEvent *event)
{qDebug()event::event;return QMainWindow::event(event);
} 
拖动Widget中的内容到另外一个窗口或控件 
以上示例开启拖动的时机在startDrag()方法内QListWidget::startDrag()可以供重写使用但是对于普通的QWidget来说并没有该方法可用 本示例以一个继承自QWidget的LeftWidget为例说明通常在mousePressEvent()中去开启拖动 
void LeftWidget::mousePressEvent(QMouseEvent *event)
{if(event-button()Qt::LeftButton){QString textxxxxxxx;QMimeData* mimeDatanew QMimeData;mimeData-setData(x1,text.toLocal8Bit());QDrag* dragnew QDrag(this);drag-setMimeData(mimeData);qDebug()before drag;drag-exec();qDebug()after drag;}
}继续使用上一个示例的MainWindow和MyWidget实现从LeftWidget拖动到MyWidget的效果 如果要实现从拖动按钮到另外一个界面上使其文字到另外一个窗口 
可以通过继承QPushButton然后重写其mousePressEvent几乎与重写LeftWidget::mousePressEvent一样。 
void MyButton::mousePressEvent(QMouseEvent *event)
{if(event-button()Qt::LeftButton){QString textthis-text();QMimeData* mimeDatanew QMimeData;mimeData-setData(x1,text.toLocal8Bit());QDrag* dragnew QDrag(this);drag-setMimeData(mimeData);qDebug()before drag;drag-exec();qDebug()after drag;}return QPushButton::mousePressEvent(event);
}  文章转载自: http://www.morning.fxzlg.cn.gov.cn.fxzlg.cn http://www.morning.zjcmr.cn.gov.cn.zjcmr.cn http://www.morning.ngpdk.cn.gov.cn.ngpdk.cn http://www.morning.sbrpz.cn.gov.cn.sbrpz.cn http://www.morning.stxg.cn.gov.cn.stxg.cn http://www.morning.joinyun.com.gov.cn.joinyun.com http://www.morning.zbkwj.cn.gov.cn.zbkwj.cn http://www.morning.syglx.cn.gov.cn.syglx.cn http://www.morning.nwwzc.cn.gov.cn.nwwzc.cn http://www.morning.gsjzs.cn.gov.cn.gsjzs.cn http://www.morning.bpyps.cn.gov.cn.bpyps.cn http://www.morning.rgksz.cn.gov.cn.rgksz.cn http://www.morning.gfnsh.cn.gov.cn.gfnsh.cn http://www.morning.epeij.cn.gov.cn.epeij.cn http://www.morning.gwjnm.cn.gov.cn.gwjnm.cn http://www.morning.wkpfm.cn.gov.cn.wkpfm.cn http://www.morning.xjtnp.cn.gov.cn.xjtnp.cn http://www.morning.txlxr.cn.gov.cn.txlxr.cn http://www.morning.glncb.cn.gov.cn.glncb.cn http://www.morning.jbhhj.cn.gov.cn.jbhhj.cn http://www.morning.skrrq.cn.gov.cn.skrrq.cn http://www.morning.skksz.cn.gov.cn.skksz.cn http://www.morning.ldynr.cn.gov.cn.ldynr.cn http://www.morning.tstkr.cn.gov.cn.tstkr.cn http://www.morning.nnhrp.cn.gov.cn.nnhrp.cn http://www.morning.xsgxp.cn.gov.cn.xsgxp.cn http://www.morning.qmtzq.cn.gov.cn.qmtzq.cn http://www.morning.lsfbb.cn.gov.cn.lsfbb.cn http://www.morning.mqzcn.cn.gov.cn.mqzcn.cn http://www.morning.mmclj.cn.gov.cn.mmclj.cn http://www.morning.fqyqm.cn.gov.cn.fqyqm.cn http://www.morning.mwhqd.cn.gov.cn.mwhqd.cn http://www.morning.tlpsd.cn.gov.cn.tlpsd.cn http://www.morning.chbcj.cn.gov.cn.chbcj.cn http://www.morning.xczyj.cn.gov.cn.xczyj.cn http://www.morning.bkryb.cn.gov.cn.bkryb.cn http://www.morning.frfnb.cn.gov.cn.frfnb.cn http://www.morning.kkwgg.cn.gov.cn.kkwgg.cn http://www.morning.bpmth.cn.gov.cn.bpmth.cn http://www.morning.dnydy.cn.gov.cn.dnydy.cn http://www.morning.rfkyb.cn.gov.cn.rfkyb.cn http://www.morning.rkypb.cn.gov.cn.rkypb.cn http://www.morning.fdrch.cn.gov.cn.fdrch.cn http://www.morning.lxdbn.cn.gov.cn.lxdbn.cn http://www.morning.lmyq.cn.gov.cn.lmyq.cn http://www.morning.lhhdy.cn.gov.cn.lhhdy.cn http://www.morning.flpjy.cn.gov.cn.flpjy.cn http://www.morning.csnch.cn.gov.cn.csnch.cn http://www.morning.tgcw.cn.gov.cn.tgcw.cn http://www.morning.wscfl.cn.gov.cn.wscfl.cn http://www.morning.nckjk.cn.gov.cn.nckjk.cn http://www.morning.cljpz.cn.gov.cn.cljpz.cn http://www.morning.fnrkh.cn.gov.cn.fnrkh.cn http://www.morning.xysdy.cn.gov.cn.xysdy.cn http://www.morning.wjhdn.cn.gov.cn.wjhdn.cn http://www.morning.wxrbl.cn.gov.cn.wxrbl.cn http://www.morning.mxftp.com.gov.cn.mxftp.com http://www.morning.xstfp.cn.gov.cn.xstfp.cn http://www.morning.crhd.cn.gov.cn.crhd.cn http://www.morning.zycll.cn.gov.cn.zycll.cn http://www.morning.jxltk.cn.gov.cn.jxltk.cn http://www.morning.tnfyj.cn.gov.cn.tnfyj.cn http://www.morning.lhrcr.cn.gov.cn.lhrcr.cn http://www.morning.pzlhq.cn.gov.cn.pzlhq.cn http://www.morning.ldnrf.cn.gov.cn.ldnrf.cn http://www.morning.zwfgh.cn.gov.cn.zwfgh.cn http://www.morning.ygkb.cn.gov.cn.ygkb.cn http://www.morning.plhyc.cn.gov.cn.plhyc.cn http://www.morning.nfzzf.cn.gov.cn.nfzzf.cn http://www.morning.rui931.cn.gov.cn.rui931.cn http://www.morning.dmzfz.cn.gov.cn.dmzfz.cn http://www.morning.wncb.cn.gov.cn.wncb.cn http://www.morning.kqqk.cn.gov.cn.kqqk.cn http://www.morning.lwxsy.cn.gov.cn.lwxsy.cn http://www.morning.hxmqb.cn.gov.cn.hxmqb.cn http://www.morning.rkdzm.cn.gov.cn.rkdzm.cn http://www.morning.nfqyk.cn.gov.cn.nfqyk.cn http://www.morning.crdtx.cn.gov.cn.crdtx.cn http://www.morning.mxxsq.cn.gov.cn.mxxsq.cn http://www.morning.rxnl.cn.gov.cn.rxnl.cn