当前位置: 代码迷 >> 综合 >> QGraphicsView 框架学习(三),图形对象的剪贴板操作
  详细解决方案

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

热度:109   发布时间:2023-11-18 02:58:32.0

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对象的格式