您的位置:首页 > 其它

QGraphicsView 框架学习(三),图形对象的剪贴板操作。

2015-07-05 12:14 627 查看
图形编辑必备功能,剪贴板。

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对象的格式,犯懒没加入。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: