qt dragEnterEvent dragLeaveEvent dragMoveEvent dropEvent都不响应的问题解决方案。

环境:vs2019+qt5.14.2

坑哦。让我搞了好久。各种不执行,最后发现,不用vs调制,直接运行exe就能接收拖拽了。

记录一下,感觉是qt的bug。上代码。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextEdit>

class MainWindow : public QMainWindow
{
	Q_OBJECT

public:
	explicit MainWindow(QWidget* parent = 0);
	~MainWindow();

protected:
	void dragEnterEvent(QDragEnterEvent* e) override;
	void dragLeaveEvent(QDragLeaveEvent* e) override;
	void dragMoveEvent(QDragMoveEvent* event) override;
	void dropEvent(QDropEvent* e) override;

private:
	bool readFile(const QString& fileName);
	QTextEdit* textEdit;
};

#endif // MAINWINDOW_H
#include <QDragEnterEvent>
#include <QMimeData>
#include <QFile>
#include <QUrl>
#include <QDebug>
#include "QtWidgetsApplication5.h"

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
{
	//this->setMouseTracking(true); 不加也行
	textEdit = new QTextEdit;
	setCentralWidget(textEdit);

	textEdit->setAcceptDrops(false); 
	setAcceptDrops(true);

	setWindowTitle(tr("Text Editor"));
}

MainWindow::~MainWindow()
{

}

void MainWindow::dragEnterEvent(QDragEnterEvent* e)
{
	qDebug() << "dragEnterEvent" << e->mimeData();
	e->accept();
	if (e->mimeData()->hasFormat("text/uri-list"))
		e->acceptProposedAction(); 
}

void MainWindow::dragLeaveEvent(QDragLeaveEvent* e)
{
	qDebug() << "dragLeaveEvent";
	//e->accept();  不加也行
}

void MainWindow::dragMoveEvent(QDragMoveEvent* event)
{
	event->setDropAction(Qt::MoveAction);
	//event->accept(); 不加也行
}

void MainWindow::dropEvent(QDropEvent* e) //释放对方时,执行的操作
{
	//e->accept(); 不加也行
	QList<QUrl> urls = e->mimeData()->urls();
	if (urls.isEmpty())
		return;

	QString fileName = urls.first().toLocalFile();

	foreach(QUrl u, urls) {
		qDebug() << u.toString();
	}
	qDebug() << urls.size();

	if (fileName.isEmpty())
		return;

	if (readFile(fileName))
		setWindowTitle(tr("%1 - %2").arg(fileName).arg("Drag File"));
}

bool MainWindow::readFile(const QString& fileName) //读文件
{
	QFile file(fileName);
	if (!file.open(QFile::ReadOnly | QFile::Text))
		return false;

	QByteArray data;
	data = file.readAll();
	textEdit->setText(QString::fromLocal8Bit(data));
	return true;
}
#include "QtWidgetsApplication5.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 QTableView 进行行拖拽时,你可以重写以下几个事件来实现拖拽行的功能:`dragEnterEvent`、`dropEvent` 和 `dragMoveEvent`。 1. dragEnterEvent:当拖动对象进入 QTableView 区域时触发该事件。你可以在该事件中判断拖动的对象是否是可接受的类型,并设置接受拖放操作。 ```cpp void YourTableView::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) { event->acceptProposedAction(); } } ``` 2. dropEvent:当拖动对象在 QTableView 区域内释放时触发该事件。你可以在该事件中处理拖放操作,例如获取拖动的行数据并进行相应的处理。 ```cpp void YourTableView::dropEvent(QDropEvent *event) { const QMimeData *mimeData = event->mimeData(); if (mimeData->hasFormat("application/x-qabstractitemmodeldatalist")) { QByteArray encodedData = mimeData->data("application/x-qabstractitemmodeldatalist"); QDataStream stream(&encodedData, QIODevice::ReadOnly); while (!stream.atEnd()) { int row, col; QMap<int, QVariant> roleDataMap; stream >> row >> col >> roleDataMap; // 处理拖放操作,例如插入数据到指定位置 // ... } event->acceptProposedAction(); } } ``` 3. dragMoveEvent:当拖动对象在 QTableView 区域内移动时触发该事件。你可以在该事件中设置合适的反馈操作,例如更改光标的形状。 ```cpp void YourTableView::dragMoveEvent(QDragMoveEvent *event) { if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) { event->setDropAction(Qt::MoveAction); event->accept(); } } ``` 记得在你的自定义 QTableView 类中重写这些事件,并将其设置为可接受拖放操作。这样,你就可以实现 QTableView 的行拖拽功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值