我有一个项目,需要将 xml 文件从 Windows 资源管理器拖放到 TableModel 中,无论我尝试了什么,该小部件都会拒绝(带有烦人的块图标)该过程并且不调用以下任何函数。
我尝试了以下方法:
- 重新实现 QAbstarctTableView::flags 以支持拖放
- 重新模拟 QAbstractTableView::supportedDropActions。
- 重新模拟 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 类型
任何人遭受并解决了这个问题或任何建议?>_<
= = = = = = = =
嘿,我也遇到了与放置站点示例相同的问题!