gpt4 book ai didi

c++ - Qt 如何防止将项目从应用程序删除到 Windows 文件资源管理器

转载 作者:行者123 更新时间:2023-11-28 07:06:05 25 4
gpt4 key购买 nike

我正在寻找一种干净且跨平台的方法来防止将项目从 Qt 应用程序删除到 Windows 文件资源管理器(或其他操作系统等价物)

下图显示了所需的行为: enter image description here

我没有运气在网上找到示例或共同破解变通方法,但它似乎是一个足够普遍的用例,因此会有一个设计和实现良好的解决方案。

我尝试过但没有奏效的:

  • 检测拖拽并杀死它:

    1. 检测QDragEnterEvent、QDragMoveEvent、QDragLeaveEvent
    2. 将事件的 answerRect() 或 pos() 与 Geometry 进行比较Window 或 Widget 以检测拖动是否已离开应用程序

    这非常 hacky(目前无法正常工作),我希望你能给我指出一个更优雅的解决方案。

(更新 - 尝试更改 mimeType,但 Windows 文件资源管理器仍然接受删除)

  • 将 MIME 类型更改为自定义类型:

    1. Pre: 上图中的“Widget w/Drag & Drop”是一个带有QFileSystemModel模型的QTreeView
    2. 子类化 QFileSystemModel 并覆盖 mimeTypes() 函数,如下面的代码
    3. qDebug() 输出来看,mimeType 似乎已正确设置,但 Windows 文件资源管理器仍接受删除:/
QStringList MyFileSystemModel::mimeTypes() const  
{
QStringList customMimeTypes;
customMimeTypes << QString("UnicornsAndRainbows/uri-list");
qDebug() << "customMimeTypes: " << customMimeTypes;
return customMimeTypes;
}

如果有机会请告诉我。

谢谢! :)

最佳答案

Dmitry Sazonov 给出了正确答案。我将在下面解释我是如何实现它的。德米特里,如果你想要信誉,请将其作为答案而不是评论发布,这样我就可以接受它作为答案。

根据 Dmitry 的建议,我在问题更新中做错的是覆盖 QFileSystemModel::mimeTypes(),而事实上,我不得不修改 QTreeView::mouseMoveEvent( )QTreeView::dropEvent()

//---------------------------------------------------------
void MyTreeView::mouseMoveEvent( QMouseEvent *event )
{
if( !(event->buttons() & Qt::LeftButton) )
{
return; // we only care about left mouse drags at the moment
}

if( (event->pos() - dragStartPosition).manhattanLength() < QApplication::startDragDistance() )
{
return; // a buffer when calculating waht qualifies as a "drag event"
}

QDrag *drag = new QDrag( this );
QMimeData *mimeData = new QMimeData();
QByteArray data;
const QStringList selectedPaths = this->getSelectedPaths(); // custom helper method

foreach( QString path, selectedPaths )
{
data.append( path ).append( ";" ); // using ';' as path deliminator
}
data.chop( 1 );

//--- this sets the custom MIME Type filter
mimeData->setData( CUSTOM_MIMETYPE_STRING, data );

drag->setMimeData( mimeData );

Qt::DropAction dropAction = drag->exec( Qt::CopyAction );
}


//---------------------------------------------------------
void MyTreeView::dropEvent( QDropEvent *event )
{
// ...

QList<QByteArray> paths;

//--- this filters based on our custom MIME Type
paths = event->mimeData()->data( CUSTOM_MIMETYPE_STRING ).split(';');

foreach( QByteArray path, paths )
{
// do something with the file paths
}
}

关于c++ - Qt 如何防止将项目从应用程序删除到 Windows 文件资源管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com