1

我有一个项目,需要将 xml 文件从 Windows 资源管理器拖放到 TableModel 中,无论我尝试了什么,该小部件都会拒绝(带有烦人的块图标)该过程并且不调用以下任何函数。
我尝试了以下方法:

  1. 重新实现 QAbstarctTableView::flags 以支持拖放
  2. 重新模拟 QAbstractTableView::supportedDropActions。
  3. 重新模拟 QAbstractTableView::mimeTypes。返回“text/uri-list”、“text/plain”、“application/xml”、“text/xml”。(有人说“text/uri-list”就足够了。)

根据我在互联网上找到的大多数帖子,我现在应该能够将文件拖到 TableView 小部件中。这对我来说不是真的。T_T

这是我的代码。

// set the flags to accept drop & drag
Qt::ItemFlags XMLFileModel::flags(const QModelIndex& index) const {
    Qt::ItemFlags defaultFlags = Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;

    if (index.isValid())
        return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
    else
        return Qt::ItemIsDropEnabled | defaultFlags;
}

.

// drop mime data
bool XMLFileModel::dropMimeData(const QMimeData *data,
    Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
    qDebug() << "Drop Mime data" << endl;

    if (action == Qt::IgnoreAction)
        return true;

    if (! data->hasUrls())
        return false;

    QList<QUrl> urls = data->urls();
    foreach(QUrl url , urls) {
        std::shared_ptr<QFile> file(new QFile(url.path()));
        if (! file->open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QMessageBox::warning(NULL, QString("note"), QString("unable to open file!"));
            return false;
        }
        XMLFilePtr xml(new XMLFile(file->fileName(), file));
        addXMLFile(xml);
    }

    return true;
}

.

Qt::DropActions XMLFileModel::supportedDropActions() const
{
    qDebug () << "supportedDropActions";
    return Qt::CopyAction | Qt::MoveAction;
}

.

// define the acceptable mime type
QStringList XMLFileModel::mimeTypes() const
{
    qDebug () << "mimeTypes";
    QStringList types;
    types << "text/uri-list" << "text/plain" << "application/xml" << "text/xml";
    qDebug() << types;
    return types;
}

. 我试图添加 QMimeData* mimeData(const QModelIndexList &indexes) const; 现在我可以在表格视图中甚至在表格视图之间拖放。调试消息也会打印。

然后我继续做测试。我写了一个测试类:

class test : public QTableView
{
    Q_OBJECT
public:
    explicit test(QWidget *parent = 0);
    virtual void dropEvent(QDropEvent *event);
    virtual void dragEnterEvent ( QDragEnterEvent * event );
    void startDrag ( Qt::DropActions supportedActions );    
};

.

void test::dropEvent(QDropEvent *event) {
    qDebug() << "test";
    qDebug() << event->mimeData()->formats();
    event->accept();
}

void test::dragEnterEvent(QDragEnterEvent *event) {
    qDebug() << "drag enter";
    qDebug() << event->mimeData();
    event->accept();
}

void test::startDrag(Qt::DropActions supportedActions) {
    qDebug() << "true";
}

. 并在接受相同模型的 mainWindow 中添加一个新的测试小部件。
令我惊讶的是,在内部或表格视图之间拖放仍然有效。但是当我试图从桌面上删除该项目时,这三个函数都没有被调用。

现在我认为问题可能是我的操作系统和 Qt D&D 框架之间不兼容的 mime 类型。我可能无法返回正确的 mime 类型

任何人遭受并解决了这个问题或任何建议?>_<
= = = = = = = =
嘿,我也遇到了与放置站点示例相同的问题!

4

1 回答 1

0

我认为除了dragEnterEvent 和dropEvent 之外,您不需要重新实现这些函数中的任何一个。你调用 QWidget::setAcceptDrops(true) 了吗?这个很重要。

于 2013-03-18T10:47:39.093 回答