【问题标题】:Qt Drop event not firingQt Drop 事件未触发
【发布时间】:2018-12-20 14:43:15
【问题描述】:

Drop 事件不会发生,尽管已经调用了 `setAcceptDrops'。以下代码基于使用 Qt 5.12.0 创建的小部件项目。添加dropEvent()函数后cpp文件变为

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug> // added

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setAcceptDrops(true); // added
}

MainWindow::~MainWindow()
{
    delete ui;
}

// added; in .h it is in `protected:' section
void MainWindow::dropEvent(QDropEvent *event)
{
    qDebug() << "dropEvent";
}

我错过了什么?我已经苦苦挣扎了几天...在此先感谢。

【问题讨论】:

  • 您的小部件有子小部件吗?
  • 根本没有子小部件。

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


【解决方案1】:

您必须覆盖允许您按数据类型、源和操作类型进行过滤的dragEnterEvent 方法。在以下示例中,所有内容都被接受:

*.h

// ...
protected:
    void dropEvent(QDropEvent *event) override;
    void dragEnterEvent(QDragEnterEvent *event) override;
// ...

*.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setAcceptDrops(true); // added
}

// ...
void MainWindow::dropEvent(QDropEvent *event)
{
    qDebug() << "dropEvent" << event;
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    event->acceptProposedAction();
}

有关更多详细信息,我建议您阅读Drag and Drop

【讨论】:

  • 它在这个工作。在我的真实项目中,我在主窗口上有一个 QListWidget 派生的小部件,添加了与您的解决方案相同的 dragEnterEvent 和 dropEvent。 drop 事件不会发生。奇怪...
  • @jianz 你在自定义QListWidget的类里面实现了那些方法吗?
  • 是的。这些方法位于自定义小部件的 .h 文件中 - 如果这就是您的意思。
  • @jianz 可能是你实现的不对,你可以把你的项目上传到github上方便查看
  • 下班后我会这样做...非常感谢。@eyllanesc
猜你喜欢
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
相关资源
最近更新 更多