3

QTableView::setModel() への呼び出しを使用して、QAbstractTableModel から継承する独自のカスタム モデルを設定する QTableView を使用しています。

テーブル ビューはドラッグ アンド ドロップをサポートしています。私のモデル クラスは mimeData() と dropMimeData() を再実装しています。アプリケーションの 2 つのインスタンス間でも、項目をドラッグ アンド ドロップできます。

私が達成したいのは、dropMimeData() は、ドロップされた要素が同じウィンドウからのものか、アプリケーションの別の実行中のコピーの別のウィンドウからのものかを検出する必要があるということです。また、ケースごとに異なる動作をする必要があります。

dropMimeData() の引数 Qt::DropAction アクションを使用するのが最も自然なことのように見えましたが、それは機能しません: 元のウィンドウに関係なく、常に Qt::CopyAction または Qt::MoveAction であり、defaultDropAction にのみ依存します。 QTableView。

これは可能ですか?

4

2 に答える 2

1

QMainWindow インスタンス MainWindow が子として 2 つの QTableView インスタンスを持っているとします
ui->tableView1ui->tableView2

関数がまだ宣言されていない場合は、次を mainwindow.h に追加します。

protected:
bool eventFilter(QObject *target, QEvent *event);

実装ファイルのコンストラクターに以下を追加します

ui->tableView1->viewport()->installEventFilter(this); 
ui->tableView2->viewport()->installEventFilter(this); 

実装ファイル mainwindow.cpp に次の関数を追加します
(関数が既に存在する場合は、if ブロックを追加します)。

bool MainWindow::eventFilter(QObject * target, QEvent *event)
{
    if (event->type() == QEvent::Drop) {
        QDropEvent *dropEvent = (QDropEvent*) event;
        // pointer target is the target and 
        // pointer dropEvent->source() is the source
        if (target == ui->tableView1->viewport()) {
            // ....
        } 
        if (target == ui->tableView2->viewport()) {
           // ...
        } 
    }
    return false; //leave further processing to widget
}

をインターセプトすることもできますQDragMoveEvent。ポインタtargetを分析するevent->source()ことで、どこに行き、どこから来たのかを知ることができます。

于 2015-08-04T18:58:29.023 に答える
0

これはQTableView、QT Designer でフォームのテーブルを右クリックして [ Promote to... ] を選択することで実行できます- サブクラスでは、adlag の提案に従いdropEvent->source()、ソースが同じウィジェットか別のウィジェットかを検出するために使用しました1。

于 2015-09-06T08:57:16.133 に答える