QGraphicsView 框架学习(三),图形对象的剪贴板操作
图形编辑必备功能,剪贴板。
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对象的格式