Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过QTableWidget行/单元格拖动在Windows中创建可拖放文件链接_C++_Windows_Qt_Drag And Drop - Fatal编程技术网

C++ 通过QTableWidget行/单元格拖动在Windows中创建可拖放文件链接

C++ 通过QTableWidget行/单元格拖动在Windows中创建可拖放文件链接,c++,windows,qt,drag-and-drop,C++,Windows,Qt,Drag And Drop,我希望允许用户从单元格拖动文件路径,并将其放入文件管理器(例如Windows资源管理器)中,以创建链接() 我假设这需要在适当的位置修改拖动的对象数据 首先,我尝试了子类化QTableWidget来重新实现事件 #include <QTableWidget> #include <QEvent> class tableWidget : public QTableWidget { Q_OBJECT public: tableWidget(QWidget *

我希望允许用户从单元格拖动文件路径,并将其放入文件管理器(例如Windows资源管理器)中,以创建链接()
我假设这需要在适当的位置修改拖动的对象数据

首先,我尝试了子类化
QTableWidget
来重新实现事件

#include <QTableWidget>
#include <QEvent>

class tableWidget : public QTableWidget
{
    Q_OBJECT

public:
    tableWidget(QWidget *parent = 0);
    ~tableWidget();

protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void dragLeaveEvent(QDragLeaveEvent *event);
    void dropEvent(QDropEvent *event);
};
#包括
#包括
类tableWidget:publicqtablewidget
{
Q_对象
公众:
tableWidget(QWidget*parent=0);
~tableWidget();
受保护的:
无效dragEnterEvent(QDragEnterEvent*事件);
无效dragMoveEvent(QDragMoveEvent*事件);
作废dragLeaveEvent(QDragLeaveEvent*事件);
作废事件(QDropEvent*事件);
};
并将Qt Designer中的“升级”
QTableWidget
到my
tableWidget
(确保对象名称与类相同),并将
dragEnabled
设置为
true

但是,事件处理程序似乎没有被执行。
所以我认为我可能找错了地方,但似乎没有实现拖放事件,尽管他说

默认情况下,项目是启用的、可编辑的、可选择的、可检查的,并且可以用作拖放操作的源和拖放目标


我需要做什么才能创造这种行为?是否需要如中所示手动创建对象?回答我自己的问题:是-似乎允许处理小部件的
viewport()
QMouseEvent
,其中根据问题中链接的文档设置QDrag对象

然后使用

QTableWidgetItem *twi = ui->tWidget->itemAt( mouseEvent->pos() );
QString dirname( twi->text() );
检索拖动的表格单元格数据的步骤

但是,如前所述,在QDrag对象MIME数据中传递链接文件内容似乎不起作用。而是传递url(“file:///...现有.lnk文件的“)可与Windows资源管理器一起使用。 这实际上没有什么区别,因为无论如何都需要使用
QFile::link()
创建链接文件。操作完成后将其卸下

虽然可以传递多个Mime数据段(参见Qt\Examples\Qt-5.5\widgets\draganddrop\dropsite),但我还没有弄清楚优先顺序是什么-例如,目标应用程序使用纯文本目标路径或链接文件的参考url


使用鼠标右键执行拖放操作时,根据
exec()
中指定为支持的拖放操作,释放时将显示上下文菜单。然后,exec返回的dropAction也可能是
TargetMoveAction
IgnoreAction
。不确定上下文菜单是否可以禁用。

回答我自己的问题:是-它似乎允许处理小部件的
viewport()
QMouseEvent
,其中根据问题中链接的文档设置QDrag对象

然后使用

QTableWidgetItem *twi = ui->tWidget->itemAt( mouseEvent->pos() );
QString dirname( twi->text() );
检索拖动的表格单元格数据的步骤

但是,如前所述,在QDrag对象MIME数据中传递链接文件内容似乎不起作用。而是传递url(“file:///...现有.lnk文件的“)可与Windows资源管理器一起使用。 这实际上没有什么区别,因为无论如何都需要使用
QFile::link()
创建链接文件。操作完成后将其卸下

虽然可以传递多个Mime数据段(参见Qt\Examples\Qt-5.5\widgets\draganddrop\dropsite),但我还没有弄清楚优先顺序是什么-例如,目标应用程序使用纯文本目标路径或链接文件的参考url

使用鼠标右键执行拖放操作时,根据
exec()
中指定为支持的拖放操作,释放时将显示上下文菜单。然后,exec返回的dropAction也可能是
TargetMoveAction
IgnoreAction
。不确定是否可以禁用关联菜单