Qtアプリケーションにドラッグアンドドロップ機能を実装しました(いくつかのコードを見たい場合は、下記を参照してください)。私はユーザーが彼のために働いていないと私に言ったまで、すべてがうまくいっていると思った。アプリケーションが特定のディレクトリにある場合、ドラッグアンドドロップが機能しない
通常アイコンが表示されます。
dragEnterEvent()
がevent->acceptProposedAction()
を呼び出していない場合は、アイコンが表示されます。問題が発生した場合は、
と似たアイコンが表示されます(これは正確なアイコンではありませんが、キャプチャできません。ウィンドウがスクリーンショットのマウスアイコンを削除するため)。
一部のコンピュータでは(悲しいことではないので、デバッグはかなり難しい)、セットアップに依存していることがわかりました。特に、インストールパス:アプリケーションが特定の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();
}
}
}
これは私がすでに考えていることですが、実際にはこれが可能である可能性があります。実際には動作していないディレクトリに特別な設定が含まれている可能性があります。これは一元的に管理されているすべての会社のコンピュータであり、特別なディレクトリは何らかの形でアプリケーションを昇格させるようです。これはおそらくスーパーユーザーの質問ですが、アプリケーションの特権レベルを確認する方法を知っていますか?タスクマネージャは何も特別なことを示していません。 – exilit
同じような結果につながっていないと言ったように再現しようとしています。しかし、私はそうする許可がないと思う。私は "管理者として実行"をクリックしていますが、Windowsはユーザーのアクセス許可で起動します。 – exilit
タスクマネージャの[詳細]ビューに[上げられた]列を追加して表示する必要があります。または、SysInternalsのProcess Explorerを使用します。 ITスタッフにお手伝いしてもらいましょう。 –