1

WindowsエクスプローラーからTableModelにxmlファイルをドラッグアンドドロップする必要があるプロジェクトを取得しました。どのように試しても、ウィジェットはプロセスを拒否し(迷惑なブロックアイコンを使用)、以下の関数は呼び出されません。
私は次のことを試しました:

  1. ドラッグアンドドロップをサポートするためにQAbstarctTableView::flagsを再実装します
  2. QAbstractTableView::supportedDropActionsを再実装します。
  3. remiplement QAbstractTableView::mimeTypes。「text/uri-list」、「text / plain」、「application / xml」、「text/xml」を返します。(「text / uri-list」で十分だという人もいます。)

インターネットで見つけたほとんどの投稿によると、ファイルをTableViewウィジェットにドラッグできるようになります。それは私には当てはまりません。T_T

これが私のコードです。

// set the flags to accept drop & drag
Qt::ItemFlags XMLFileModel::flags(const QModelIndex& index) const {
    Qt::ItemFlags defaultFlags = Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;

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

// drop mime data
bool XMLFileModel::dropMimeData(const QMimeData *data,
    Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
    qDebug() << "Drop Mime data" << endl;

    if (action == Qt::IgnoreAction)
        return true;

    if (! data->hasUrls())
        return false;

    QList<QUrl> urls = data->urls();
    foreach(QUrl url , urls) {
        std::shared_ptr<QFile> file(new QFile(url.path()));
        if (! file->open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QMessageBox::warning(NULL, QString("note"), QString("unable to open file!"));
            return false;
        }
        XMLFilePtr xml(new XMLFile(file->fileName(), file));
        addXMLFile(xml);
    }

    return true;
}

Qt::DropActions XMLFileModel::supportedDropActions() const
{
    qDebug () << "supportedDropActions";
    return Qt::CopyAction | Qt::MoveAction;
}

// define the acceptable mime type
QStringList XMLFileModel::mimeTypes() const
{
    qDebug () << "mimeTypes";
    QStringList types;
    types << "text/uri-list" << "text/plain" << "application/xml" << "text/xml";
    qDebug() << types;
    return types;
}

。QMimeData * mimeData(const QModelIndexList&indexes)const;を追加しようとしました そして今、私はテーブルビュー内またはテーブルビュー間でさえドラッグアンドドロップすることができました。デバッグメッセージも出力されます。

それから私はテストを続けました。私はテストクラスを書きました:

class test : public QTableView
{
    Q_OBJECT
public:
    explicit test(QWidget *parent = 0);
    virtual void dropEvent(QDropEvent *event);
    virtual void dragEnterEvent ( QDragEnterEvent * event );
    void startDrag ( Qt::DropActions supportedActions );    
};

void test::dropEvent(QDropEvent *event) {
    qDebug() << "test";
    qDebug() << event->mimeData()->formats();
    event->accept();
}

void test::dragEnterEvent(QDragEnterEvent *event) {
    qDebug() << "drag enter";
    qDebug() << event->mimeData();
    event->accept();
}

void test::startDrag(Qt::DropActions supportedActions) {
    qDebug() << "true";
}

。同じモデルを受け入れる新しいテストウィジェットをメインウィンドウに追加します。
内部またはテーブルビュー間でのドラッグアンドドロップがまだ機能していることに驚きました。しかし、デスクトップからアイテムをドロップしようとすると、これら3つの関数のいずれも呼び出されません。

今、問題は私のOSとQt D&Dフレームワークの間の互換性のないmimeタイプである可能性があると考えています。正しいmimeタイプを返さない場合があります

誰かが苦しんでこの問題や提案を解決しましたか?> _ <
= = = = = = = =
ねえ、私もドロップサイトの例で同じ問題が発生しました!

4

1 に答える 1

0

dragEnterEvent と dropEvent を除いて、これらの関数を再実装する必要はないと思います。QWidget::setAcceptDrops(true) を呼び出しましたか? これは重要。

于 2013-03-18T10:47:39.093 に答える