2017-07-09 8 views
0

私は、ファイル構造を表示する非常に簡単なコードを、持っている:私は、ファイルやドラッグを選択することができますQtアプリケーションで内部的にQFileSystemModelのドラッグアンドドロップ操作が行われないのはなぜですか?

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 
private: 
    Ui::MainWindow *ui; 
    QFileSystemModel model; 
    QTreeView treeView; 
}; 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    model.setRootPath(QDir::rootPath()); 
    ui->treeView->setModel(&model); 
    ui->treeView>setSelectionMode(QAbstractItemView::SingleSelection); 
    ui->treeView->setDragEnabled(true); 
    ui->treeView->viewport()->setAcceptDrops(true); 
    ui->treeView->setDropIndicatorShown(true); 
    ui->treeView->setDragDropMode(QAbstractItemView::InternalMove); 
    ui->treeView->setAcceptDrops(true); 

    ui->tableView->setModel(&model); 
} 

は、フォルダやデスクトップ上に直接にドロップ&が、私は内部的に何か(移動またはコピーを実行しようとする場合、doesnのそれはこれを示すexample - even cursor shows that I can't drop 私はすべてのオプションを試したようだ、私は何かを書くか、他のオプションを設定することを忘れましたか?

答えて

1

私はカーソル は、それが「ドロップ」アクションの準備ができて表示を見ることができない、まだビューのデータソースと 有効にドラッグ&ドロップなどQFileSystemModelでQTreeViewベースのUIウィジェットを実装しますがしています。私は何を取りこぼしたか?

似たようなコードで覗いてみると、あなたの経験からお答えします。

// MyFileSysModel is a child from model class used in your example. 
// Mind that specific application drag and drop logic may differ. 
// I in fact modified that from QSortFilterProxyModel-type of class 
// but that should be similar. 
Qt::ItemFlags MyFileSysModel::flags(const QModelIndex &index) const 
{ 
    Qt::ItemFlags defaultFlags = QFileSystemModel::flags(index); 

    if (!index.isValid()) 
     return defaultFlags; 

    const QFileInfo& fileInfo = this->fileInfo(index); 

    // The target 
    if (fileInfo.isDir()) 
    { 
     // allowed drop 
     return Qt::ItemIsDropEnabled | defaultFlags; 
    } 
    // The source: should be directory (in that case) 
    else if (fileInfo.isFile()) 
    { 
     // allowed drag 
     return Qt::ItemIsDragEnabled | defaultFlags; 
    } 

    return defaultFlags; 
} 

...そして、もちろん、私たちは今、派生モデルクラスを使用する必要があります:モデルの側に必要なドロップもう少し仕事を受け入れる項目を解決するために

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 
private: 
    Ui::MainWindow *ui; 
    MyFileSysModel model; // has virtual function member "flags" 
    QTreeView treeView; 
}; 
関連する問題