0

OK、これは簡単なはずです。

QGraphicsView ウィジェットへのドロップ イベントを処理しようとしました。QTreeView ウィジェットからドラッグされた着信データ。そのために、これらのメソッドを再実装しました。

void QGraphicsScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
    event.accept();
}

void QGraphicsScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{
    event.accept();
}

void QGraphicsScene::dropEvent(QGraphicsSceneDragDropEvent *event)
{
    event.accept();
}


void QGraphicsView::dropEvent(QDropEvent *event)
{
    QPixmap pixmap(event->mimedata()->urls()[0].toString().remove(0,8));
    this.scene()->addPixmap(pixmap);
}

これは正常に機能します。しかし、このウィジェットのドロップ イベント内で別のグラフィックス ビュー シーンを変更するにはどうすればよいですか? あれは:

void QGraphicsView::dropEvent(QDropEvent *event)
{
    QPixmap pixmap(event->mimedata()->urls()[0].toString().remove(0,8));
    // I cannot access ui; and cannot access my widgets...:
    ui->anotherview->scene()->addPixmap(pixmap);
}
4

1 に答える 1

1

QGraphicsView のようなカスタム シグナルを作成し、void showPixmap(QPixmap p)UI 要素にアクセスできるメインの gui クラスのスロットに接続するのはどうですか。emit showPixamp(pixmap)その後、dropEventを呼び出すことができます。

QGraphicsView のサブクラス化

//header file
class CustomView : public QGraphicsView 
{
public:
    CustomView(QGraphicsScene*, QWidget*=NULL);
    ~CustomView();

signals:
    void showPixmap(QPixmap p);

protected:
    virtual void dropEvent(QDropEvent *event);
};


//cpp file
CustomView::CustomView(QGraphicsScene *scene, QWidget* parent)
    :QGraphicsView(scene, parent) 
{
    //if you need to initialize variables, etc.
}
void CustomView::dropEvent(QDropEvent *event)
{
    //handle the drop event
    QPixmap mPixmap;
    emit showPixmap(mPixmap);
}

メイン GUI クラスでのイベント フィルタの使用

void GUI::GUI()
{     
    ui->mGraphicsView->installEventFilter(this);
}
bool GUI::eventFilter(QObject *object, QEvent *event)
{
    if (object == ui->mGraphicsView && event->type() == QEvent::DropEnter) {
        QDropEvent *dropEvent = static_cast<QDropEvent*>(event);
        //handle the drop event
        return true;
    }
    else
        return false;
}
于 2013-08-21T17:50:35.410 に答える