您的位置:首页 > 编程语言 > Qt开发

Qt:拖放操作和剪贴板

2014-10-11 15:05 183 查看
一、拖放操作:

为了开始一个拖动,要创建一个QDrag对象,然后调用它的start()函数,在窗口部件的mousePressEvent()中开始

一个拖放操作,代码框架如下:

void MainWindow::mousePressEvent(QMouseEvent *event){

if(event->button() == Qt::LeftButton){

QDrag *drag = new QDrag(this);

QMimeData *mimeData = new QMimeData; //剪贴板的数据描述也用QMimeData

mimeData->setText(textEdit->toPlainText());

drag->setMimeData(mimeData);

Qt:DropAction dropAction = drag->start();//参数:Qt::CopyAction,MoveAction,LinkAction,IgnoreAction

......

}

}

为使目标窗口部件能够接受拖放操作,调用setAcceptDrops(true)。还要实现dragEnterEvent()、dragMoveEvent()和dropEvent():

void imageWidget::dragEnterEvent(QDragEnterEvent *event){ //拖动进入事件

if(event->mimeData()->hasUrls()){ //hasHtml(),hasText(),hasUrls(),hasColor();

QString localFile;

QRegExp rx("\\.(jpg|bmp|jpeg|png|xpm)$",Qt::CaseInsensitive);

foreach(QUrl url , event->mimeData()->urls()){

localFile = url.toLocalFile();

if(rx.indexIn(localFile) >= 0){

event->accept();

return ;

}else{

event->ignore();

}

}

}else{

event->ignore();

}

}

void imageWidget::dragMoveEvent(QDragMoveEvent *event){ //拖动移动事件

if(event->mimeData()->hasUrls()){

QString localFile;

QRegExp rx("\\.(jpg|bmp|jpeg|png|xpm)$",Qt::CaseInsensitive);

foreach(QUrl url , event->mimeData()->urls()){

localFile = url.toLocalFile();

if(rx.indexIn(localFile) >= 0){

event->accept();

return ;

}else{

event->ignore();

}

}

}else{

event->ignore();

}

}

void imageWidget::dropEvent(QDropEvent *event){ //鼠标松开事件

if(event->mimeData()->hasUrls()){

QString localFile;

QRegExp rx("\\.(jpg|bmp|jpeg|png|xpm)$",Qt::CaseInsensitive);

foreach(QUrl url , event->mimeData()->urls()){

localFile = url.toLocalFile();

if(rx.indexIn(localFile) >= 0){

event->accept();

setPixmap(localFile);

return ;

}else{

event->ignore();

}

}

}else{

event->ignore();

}

}

为了实现拖放自定义的数据类型,可以自定义MIME类型,所有数据放在QByteArray的字节数组内,然后使用自定义的数据类型:

QByteArray itemData;

QDataStream dataStream(&itemData,QIODevice::WriteOnly);

dataStream << pixmap << event->pos();

QMimeData *mimeData = new QMimeData;

mimeData->setData("application/mymimedata",itemData);

QByteArray itemData = event->mimeData()->data("application/mymimedata"); //接收放下的数据

QDataStream dataStream(&itemData,QIODevice::ReadOnly);

/*************************************************************************************************************/

二、使用剪贴板:

使用QClipboard类可以存取窗口系统的剪贴板,获取QClipboard对象的方法如下:

clipboard = QApplication::clipboard();

在Qt中使用QMimeData类来表示剪贴板交换的数据.

setText(),setImage(),setPixmap()设置剪贴板数据;image(),pixmap(),text()取剪贴板数据;clear()清空剪贴板。

clipboard->setText(lineEdit->text(),QClipboard::Clipboard);

通过生成一个QMimeData对象然后调用setData()存放数据,使用setMimeData()将数据存入剪贴板。

当剪贴板数据发生改变时,QClipboard类发出dataChanged()信号

eg:

copyAct = new QAction(QIcon(":/images/copy.png"),tr("Copy"),this);

copyAct->setShortcut(QKeySequence::Copy);

connect(copyAct,SIGNAL(triggered()),this,SLOT(copy()));

void MainWindow::copy(){

QPixmap pix = imageWidget->getPixmap();

clipboard->setImage(pix.toImage());

}

//so easy!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: