QGraphicsView 框架学习(三),图形对象的剪贴板操作。
2015-07-05 12:14
627 查看
图形编辑必备功能,剪贴板。
Qt本身提供 QClipboard 对象,它使用也很方便,有轮子就不用自己造轮子,不说废话,我们需要利用QMimeData对象来存储我们的图形元素,所以我们要声明一个QMimeData的派生类。
这里面包含一个存储对象的列表,这样我们就可以拷贝多个对象了。看看怎么用吧。
首先我们需要在主窗口创建几个slot
连接信号槽
使用剪贴板
其实还应该设置mime对象的格式,犯懒没加入。
Qt本身提供 QClipboard 对象,它使用也很方便,有轮子就不用自己造轮子,不说废话,我们需要利用QMimeData对象来存储我们的图形元素,所以我们要声明一个QMimeData的派生类。
class ShapeMimeData : public QMimeData { Q_OBJECT public: ShapeMimeData( QList<QGraphicsItem * > items); ~ShapeMimeData(); QList<QGraphicsItem *> items() const ; private: QList<QGraphicsItem * > m_items; };
这里面包含一个存储对象的列表,这样我们就可以拷贝多个对象了。看看怎么用吧。
首先我们需要在主窗口创建几个slot
void on_copy(); void on_paste(); void on_cut(); //没找到如何判断剪贴板中有数据存在的方法,变通的方法就是只要剪贴板数据有变化就认为它可以做粘贴操作。 void dataChanged();
连接信号槽
connect(copyAction,SIGNAL(triggered()),this,SLOT(on_copy)); connect(pasteAction,SIGNAL(triggered()),this,SLOT(on_paste)); connect(cutAction,SIGNAL(triggered()),this,SLOT(on_cut)); //剪贴板内容有变化 connect(QApplication::clipboard(),SIGNAL(dataChanged()),this,SLOT(dataChanged()));
使用剪贴板
void MainWindow::on_copy() { ShapeMimeData * data = new ShapeMimeData( scene->selectedItems() ); QApplication::clipboard()->setMimeData(data); } void MainWindow::on_paste() { QMimeData * mp = const_cast<QMimeData *>(QApplication::clipboard()->mimeData()) ; ShapeMimeData * data = dynamic_cast< ShapeMimeData*>( mp ); if ( data ){ scene->clearSelection(); foreach (QGraphicsItem * item , data->items() ) { AbstractShape *sp = qgraphicsitem_cast<AbstractShape*>(item); QGraphicsItem * copy = sp->copy(); if ( copy ){ copy->setSelected(true); copy->moveBy(10,10); QUndoCommand *addCommand = new AddCommand(copy, scene); undoStack->push(addCommand); } } } } void MainWindow::on_cut() { QList<QGraphicsItem *> copylist ; foreach (QGraphicsItem *item , scene->selectedItems()) { AbstractShape *sp = qgraphicsitem_cast<AbstractShape*>(item); QGraphicsItem * copy = sp->copy(); if ( copy ) copylist.append(copy); } QUndoCommand *deleteCommand = new DeleteCommand(scene); undoStack->push(deleteCommand); if ( copylist.count() > 0 ){ ShapeMimeData * data = new ShapeMimeData( copylist ); QApplication::clipboard()->setMimeData(data); } } void MainWindow::dataChanged() { pasteAction->setEnabled(true); }
ShapeMimeData中的内容都是图形元素的副本,ShapeMimeData析构函数中需要释放。
ShapeMimeData::ShapeMimeData(QList<QGraphicsItem *> items) { foreach (QGraphicsItem *item , items ) { AbstractShape *sp = qgraphicsitem_cast<AbstractShape*>(item); m_items.append(sp->copy()); } } ShapeMimeData::~ShapeMimeData() { foreach (QGraphicsItem *item , m_items ) { delete item; } m_items.clear(); }
其实还应该设置mime对象的格式,犯懒没加入。
相关文章推荐
- Windows上安装、配置MySQL的常见问题
- this指针基础介绍
- leetcode 217:Contains Duplicate
- (4)使用zabbix监控web
- Android 中的 ViewPager+ Fragment
- 建别墅
- 简单的TCP通信
- SPI协议及工作原理分析
- HomePageViewController
- CSS3制作W3cplus的关注面板
- Java类编译后Class文件概述(下)
- 函数指针及其的运用(上)——何为函数指针
- 能量项链(NOIP)
- 网络时代:我只是一个用户
- 最小交换合并
- 不能打开chm
- npm镜像使用方法
- Java 利用ASM读取变量值(Field value)问题研究
- 音乐的播放与停止
- java反射:使用asm 获取方法的参数名