1

Qt4.2を使用しています。

.desktopファイルから取得したいくつかのアイテムを表示するためにQStandardItemModelを使用するQListViewを備えたQMainWindowがあります。

今、私はアプリにドロップアクションを実装しようとしています。たとえば、.htmlファイルがfirefoxアイテムにドロップされたときにfirefoxを実行できます。

だからこれは私がやったことです:

-listViewの場合:

 viewport()->setAcceptDrops(true);
 setAcceptDrops(true);
 setDragEnabled(true);
 setDropIndicatorShown(true);
 setDragDropMode(QListView::DragDrop);

-standardItemModelの場合:

Qt::DropActions supportedDropActions() const {
    return Qt::CopyAction | Qt::MoveAction;
}
Qt::ItemFlags flags(const QModelIndex &index) const {
    return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled |
           Qt::ItemIsDropEnabled | Qt::ItemIsEnabled;
}
QStringList mimeTypes() const {
    QStringList types;
    types<<"text/uri-list";
    return types;
}
bool dropMimeData(const QMimeData *data, Qt::DropAction action,
                  int row, int column, const QModelIndex &parent) {
    qDebug() << "dropMimeData";
}

その後、アプリにファイルをドロップしても、dropMimeDataデバッグメッセージが表示されません。

4

1 に答える 1

1

dragEnterEvent()andも再実装する必要がありますdropEvent()- それらは の仮想関数ですQListView

ドキュメントから:

ドロップ

ウィジェットにドロップされたメディアを受信できるようにするには、ウィジェットに対して setAcceptDrops(true) を呼び出し、dragEnterEvent() および dropEvent() イベント ハンドラー関数を再実装します。

たとえば、次のコードは QWidget サブクラスのコンストラクターでドロップ イベントを有効にし、ドロップ イベント ハンドラーを便利に実装できるようにします。

 void Window::dragEnterEvent(QDragEnterEvent *event)
 {
     if (event->mimeData()->hasFormat("text/plain"))
         event->acceptProposedAction();
 }


 void Window::dropEvent(QDropEvent *event)
 {
     textBrowser->setPlainText(event->mimeData()->text());
     mimeTypeCombo->clear();
     mimeTypeCombo->addItems(event->mimeData()->formats());

     event->acceptProposedAction();
 }
于 2012-12-12T12:56:51.313 に答える