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!
为了开始一个拖动,要创建一个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!
相关文章推荐
- Qt实现拖放操作
- Qt学习------简单的文件拖放操作
- Qt初级:基于拖放操作和文件流操作的文件转换小助手
- Qt:自定义拖放操作
- Qt 自定义拖放操作
- Qt 剪贴板操作
- C#中的拖放操作 (转载)
- 全面掌握C#中的拖放操作
- 在FIREFOX下操作剪贴板的脚本
- javascript可以轻松操作客户端剪贴板内容
- C# 拖放操作源码详解2
- Javascript Tip(1) 操作剪贴板
- listbox实现拖放操作
- 全面掌握C#中的拖放操作
- 剪贴板简单操作例子
- 全面掌握C#中的拖放操作
- Javascript Tip(1) 操作剪贴板
- Control study -> Drag拖放数据操作示例
- 创建可编辑的xml文档(之三)执行拖放操作
- c++中对剪贴板的操作一览