【问题标题】:Create Droppable file link in Windows from QTableWidget row/cell Drag从 QTableWidget 行/单元格拖动在 Windows 中创建 Droppable 文件链接
【发布时间】:2016-11-29 15:44:16
【问题描述】:

我希望允许用户从QTableWidget 单元格中拖动文件路径并将其放到文件管理器(例如 Windows 资源管理器)中以创建链接(Windows file shortcut)。
我认为这需要修改拖动的对象数据?

首先,我尝试子类化 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);
};

并在 Qt Designer 中将QTableWidget“提升”为我的tableWidget(确保objectName 不与类相同)并将dragEnabled设置为true

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

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

我需要做什么才能创建这种行为?是否需要手动创建QDrag对象,如Drag and Drop所示?

【问题讨论】:

    标签: c++ windows qt drag-and-drop


    【解决方案1】:

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

    然后使用

    QTableWidgetItem *twi = ui->tWidget->itemAt( mouseEvent->pos() );
    QString dirname( twi->text() );
    

    检索拖动的表格单元格数据

    但是,在 QDrag 对象 MIME 数据中传递链接文件内容似乎不起作用,正如 here 所指出的那样。相反,传递现有 .lnk 文件的 url ("file:///...") 适用于 Windows 资源管理器。 这并没有真正的区别,因为需要使用例如创建链接文件。 QFile::link() 无论如何。操作完成后移除。

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

    当使用鼠标右键进行拖放操作时,将在释放时显示上下文菜单,具体取决于 exec() 中指定为 supportedActions 的 DropActions。然后 exec 返回的 dropAction 也可能是 TargetMoveActionIgnoreAction。不确定是否可以禁用上下文菜单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 2015-04-07
      • 2011-03-21
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多