3

QStandardItemModelがアタッチされたQTreeViewがあります。外部ソースからのドラッグアンドドロップを有効にしようとしています。ドキュメントに記載されているドラッグアンドドロップとドラッグアンドドロップをアイテムビューですべて実行しましたが、正しく機能していません。ファイルをツリービューにドラッグしようとすると、ドロップが使用できないことを示すXがアイコンに常に表示されます。(私はOS Xを使用していますが、アイコンがウィンドウのように見えるかわかりません)。特定のアイテムをドロップできるようにしたいのですが、基本を理解するまで、その機能をコーディングすることはできません。

これが私のサブクラス化されたツリービューのソースコードです。

MyTreeView::MyTreeView(QWidget *parent) :
    QTreeView(parent)
{
    setContextMenuPolicy(Qt::CustomContextMenu);
    setAcceptDrops(true);
    setDropIndicatorShown(true);
}

void MyTreeView::dragEnterEvent(QDragEnterEvent *event)
{
    event->acceptProposedAction();
}

void MyTreeView::dropEvent(QDropEvent *event)
{
    qDebug("I am here");
    event->acceptProposedAction();
}

サブクラス化された標準アイテムモデルのソースは次のとおりです。

MyStandardItemModel::MyStandardItemModel(QObject *parent) :
    QStandardItemModel(parent)
{
}

Qt::DropActions MyStandardItemModel::supportedDropActions() const
{
    return Qt::CopyAction;
}

Qt::ItemFlags MyStandardItemModel::flags(const QModelIndex &index) const
{
    Qt::ItemFlags defaultFlags = QStandardItemModel::flags(index);

    if (index.isValid())
        return Qt::ItemIsDropEnabled | defaultFlags;
    else
        return defaultFlags;
}

bool MyStandardItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
    qDebug("I am in the model");
}

私が言ったように、アイコンはドロップが利用できないことを示していますが、とにかくドロップすると、ツリービューからの「私はここにいます」というテキストが印刷されます。ただし、モデルビューの「Iaminthemodel」というテキストは印刷されません。ドロップが利用可能であることをモデルに認識させてアイコンを変更するため、またはdropMimeData関数を呼び出すために何をする必要があるのか​​わかりません。ドキュメントを何度も読んだことがあり、明らかに何かが足りないので、助けていただければ幸いです。

4

1 に答える 1

1

これは、メソッドを再実装する必要があるためだと思いますdragMoveEvent(QDragMoveEvent*)。そうしないと、各アイテムが個別に、ドロップを受け入れることができないと宣言します。

于 2012-06-04T11:44:41.613 に答える