두 개의 위젯 ParentWidget
및 ChildWidget
은 모두 QWidget
에서 파생되었으며 둘 다 void dragEnterEvent(QDragEnterEvent *event)
을 재정의했습니다.QEvent를 그냥 무시하는 대신 폐기하는 방법
ChildWidget
은 ParentWidget
에 포함되어 있습니다. 이제 QDragEvent*
이라는 event
이 ParentWidget
에는 유효하지만 ChildWidget
에는 유효하지 않으며 ChildWidget
에 대한 dragEnterEvent
이 있다고 가정합니다.
이제 ChildWidget
에 대한 이벤트를 무시하기 위해 event->ignore()
을 호출 할 수 있지만 ParentWidget
에 대한 dragEnterEvent
을 호출 할 수 있습니다.
그리고 내 문제입니다. 그 이벤트가 이미 ChildWidget
에서 삭제 된 경우 ParentWidget
에 대한 dragEnterEvent
이 호출되기를 원하지 않습니다.
간단히 말해서 나는 단지 이벤트가 무시되기를 원하지 않지만 더 나아가 이벤트는 dragEnterEvent
의 ChildWidget
안에 완전히 버려야합니다.
ParentWidget
과 ChildWidget
이 느슨하게 결합 된 구성 요소라는 가정하에 어떻게 이러한 동작을 수행 할 수 있습니까?
최소한의 예
다음 예는 나는 또한 달성하기 위해 노력하고있어 보여줍니다 어떤 의미에서 가능한 방법입니다. 보다 복잡한 시나리오의 경우 지나치게 복잡한 코드가 발생합니다. ParentWidget
이미 ChildWidget
무시 제외한 모든 방울을 받아들이는 반면
ChildWidget
는 txt
끝나는 파일 이름을 드롭을 받아들입니다.
MAIN.CPP
#include <QApplication>
#include "ParentWidget.h"
int main(int argc, char** args) {
QApplication app(argc, args);
auto widget=new ParentWidget;
widget->show();
app.exec();
}
ParentWidget.h
#pragma once
#include <QWidget>
#include <QDebug>
#include <QDragEnterEvent>
#include <QHBoxLayout>
#include <QLabel>
#include "ChildWidget.h"
class ParentWidget : public QWidget {
Q_OBJECT
public:
ParentWidget(QWidget* parent = nullptr) : QWidget(parent) {
setLayout(new QHBoxLayout);
setAcceptDrops(true);
layout()->addWidget(new QLabel("ParentLabel"));
layout()->addWidget(new ChildWidget);
}
void dragEnterEvent(QDragEnterEvent *event) override {
qDebug() << "Parent";
// Check if event was already ignored in ChildWidget?
if (auto childWidget = qobject_cast<ChildWidget*>(childAt(event->pos()))) {
event->ignore();
}
else {
event->acceptProposedAction();
}
}
};
ChildWidget.h
#pragma once
#include <QWidget>
#include <QUrl>
#include <QMimeData>
#include <QDragEnterEvent>
#include <QLabel>
#include <QDebug>
#include <QByteArray>
#include <QHBoxLayout>
class ChildWidget : public QWidget {
Q_OBJECT
public:
ChildWidget(QWidget* parent = nullptr) : QWidget(parent) {
setAcceptDrops(true);
setLayout(new QHBoxLayout);
layout()->addWidget(new QLabel("ChildLabel"));
}
void dragEnterEvent(QDragEnterEvent *event) override {
qDebug() << "Child";
if (auto mimeData=event->mimeData()) {
auto url = QUrl(mimeData->text());
if (!url.isValid()) { event->ignore(); return; }
if (!url.isLocalFile()) { event->ignore(); return; }
auto filename = url.fileName();
if (!filename.endsWith(".txt")) { event->ignore(); return; }
// ChildWidget can only process txt files.
qDebug() << url.fileName();
event->acceptProposedAction();
}
else {
event->ignore();
}
}
};
당신은 당신의 구현을 보여줄 수 있습니까? 가상의 –
@ThibautB이기 때문에''''ChildWidget'''에 대해'''dragEnterEvent'''를 재 구현할 수 있습니다. 두 위젯 인'ChildWidget'과'ParentWidget'에 대해'dragEnterEvent'를 구현했습니다. 'ParentWidget'에 대한'dragEnterEvent'는 이벤트가'ChildWidget'의'dragEnterEvent'에서 무시되면 다르게 행동해야한다는 것입니다. – Aleph0
@ ThibautB. 'QDragEnterEvent'가이 부울을 전송할 수 있습니까? – Aleph0