2016-06-15 5 views
2

Qtアプリケーションにドラッグアンドドロップ機能を実装しました(いくつかのコードを見たい場合は、下記を参照してください)。私はユーザーが彼のために働いていないと私に言ったまで、すべてがうまくいっていると思った。アプリケーションが特定のディレクトリにある場合、ドラッグアンドドロップが機能しない

通常Drag and drop okアイコンが表示されます。dragEnterEvent()event->acceptProposedAction()を呼び出していない場合は、Filetype unsupportedアイコンが表示されます。問題が発生した場合は、Does not work iconと似たアイコンが表示されます(これは正確なアイコンではありませんが、キャプチャできません。ウィンドウがスクリーンショットのマウスアイコンを削除するため)。

一部のコンピュータでは(悲しいことではないので、デバッグはかなり難しい)、セットアップに依存していることがわかりました。特に、インストールパス:アプリケーションが特定の1つのディレクトリ(またはそのサブディレクトリの1つ)にある場合、説明されているエラーが発生します。アプリケーションディレクトリ全体をどこか別の場所に移動してそこから実行すると、すべて正常に動作します。

デバッグ出力を追加すると、dragEnterEvent()が壊れたセットアップで起動しないことが示されました。

どのような理由があることだろうか?どうすればその問題をデバッグできますか?


私にはいくつかの疑いがありましたが、それは本当に意味がありません。しかし、私はとにかくそれを共有したい:

  • 権限(しかし、なぜドラッグ&ドロップ、右の権限に依存している必要がありますか?)別のウィジェットが受け取る使用
  • 間違ったライブラリ(インストールされている複数のQtのバージョンが存在するとして)
  • イベント(?どのようにアプリケーションディレクトリに依存できる)

コードスニペット:

MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent), 
    /* more here */ 
{ 
    /* more here */ 
    setAcceptDrops(true); 
    /* more here */ 
} 

void MainWindow::dragEnterEvent(QDragEnterEvent* event) 
{ 
    const QMimeData* mimeData = event->mimeData(); 

    if (mimeData->hasUrls()) { 
     QString fileName = mimeData->urls().at(0).toLocalFile(); 
     QFileInfo file(fileName); 

     if(isSupportedFileType(file.completeSuffix())) { 
      event->acceptProposedAction(); 
     } 
    } 
} 


void MainWindow::dropEvent(QDropEvent *event) 
{ 
    const QMimeData* mimeData = event->mimeData(); 

    if (mimeData->hasUrls()) { 
     QList<QUrl> urlList = mimeData->urls(); 

     if(openFiles(urlList)) { 
      event->acceptProposedAction(); 
     } 
    } 
} 

答えて

3

D + Dが認識できない理由で失敗するようなシナリオが1つあります。簡単にあなたのマシン上のreproに、あなたのアプリのショートカットを右クリックし、 "管理者として実行"を選択します。

UIPIは、非昇格アプリから昇格アプリへのドラッグを禁止しています。騒々しいフィードバックはなく、あなたのアプリは単にD + Dイベントを取得しません。これについてあなたのユーザーにインタビューすると、彼はあなたのアプリを上げる必要があるかどうかを知りたいでしょう。あなたのインストーラが自動的にあなたのアプリを起動させるのと同じ方法で不正行為をするでしょう。

+0

これは私がすでに考えていることですが、実際にはこれが可能である可能性があります。実際には動作していないディレクトリに特別な設定が含まれている可能性があります。これは一元的に管理されているすべての会社のコンピュータであり、特別なディレクトリは何らかの形でアプリケーションを昇格させるようです。これはおそらくスーパーユーザーの質問ですが、アプリケーションの特権レベルを確認する方法を知っていますか?タスクマネージャは何も特別なことを示していません。 – exilit

+0

同じような結果につながっていないと言ったように再現しようとしています。しかし、私はそうする許可がないと思う。私は "管理者として実行"をクリックしていますが、Windowsはユーザーのアクセス許可で起動します。 – exilit

+0

タスクマネージャの[詳細]ビューに[上げられた]列を追加して表示する必要があります。または、SysInternalsのProcess Explorerを使用します。 ITスタッフにお手伝いしてもらいましょう。 –

関連する問題