Qt:拖放操作和剪贴板

来源:互联网 发布:js上下移动div 编辑:程序博客网 时间:2024/06/05 05:49
一、拖放操作:
为了开始一个拖动,要创建一个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!

0 0
原创粉丝点击