Qt - QTableWidget does not accept drops

I am doing a project that uses a QTableWidget. When I tried to do this to take the drops, I found out that he was not behaving the way I thought. The fact is that if I change the QTableWidget to a QWidget, then the fall will be accepted. So the problem is not coding. Here is the code, and since I'm dealing with a problem, in the "MyDropWidget" class

#include <QMouseEvent> #include <QWidget> #include <QMessageBox> #include <math.h> #include <QApplication> #include <QPainter> #include <sstream> #include <QDragEnterEvent> #include <QDropEvent> #include <QLabel> #include <QPaintEvent> #include <QTableWidget> #define RADIUS 2 #define DISTANCE_BETWEEN_OBJECTS 2 #define DASH_RECT_HALF_WIDTH 2 #include <QHeaderView> #include <QPainter> #include <QHBoxLayout> #include <QWidget> #include <QApplication> class MyMessageBox:public QMessageBox { public: MyMessageBox(std::string message,QWidget *parent=0):QMessageBox(QMessageBox::NoIcon,QString("ErrorMessage"),QString(message.c_str()),QMessageBox::Ok,parent,Qt::Widget) { } }; class MyDragWidget:public QWidget { private: QPoint * start_Pos; QPixmap drag_Pixmap; public: MyDragWidget(QWidget * parent); private: void mousePressEvent(QMouseEvent * event); void mouseReleaseEvent(QMouseEvent * event); void mouseMoveEvent(QMouseEvent * event); }; MyDragWidget::MyDragWidget(QWidget * parent):QWidget(parent) { setPalette(QPalette(QColor(0,0,0))); setAutoFillBackground(true); start_Pos = NULL; drag_Pixmap = QPixmap(50,50); QPainter painter(&drag_Pixmap); painter.setPen(QColor(255,0,0)); painter.drawText(0,0,50,50,Qt::AlignCenter,"drag Pic"); painter.end(); resize(100,200); } void MyDragWidget::mousePressEvent(QMouseEvent *event) { QWidget::mousePressEvent(event); if(event->button() == Qt::LeftButton) { if(start_Pos) delete start_Pos; start_Pos = new QPoint(event->pos()); } } void MyDragWidget::mouseReleaseEvent(QMouseEvent *event) { if(start_Pos) delete start_Pos; start_Pos = NULL; } void MyDragWidget::mouseMoveEvent(QMouseEvent *event) { if(!(event->buttons() & Qt::LeftButton)) { MyMessageBox mb("mouse move 0"); mb.exec(); return; } if(!start_Pos) return; QDrag * drag = new QDrag(this); drag->setPixmap(drag_Pixmap); QMimeData * mimeData = new QMimeData(); mimeData->setText("name"); drag->setMimeData(mimeData); Qt::DropAction dropAction = drag->exec(Qt::CopyAction,Qt::MoveAction); } class MyDropWidget:public QTableWidget { public: MyDropWidget(QWidget * parent); private: void dragEnterEvent(QDragEnterEvent * event); void dropEvent(QDropEvent *event); }; MyDropWidget::MyDropWidget(QWidget * parent):QTableWidget(parent) { setColumnCount(6); setRowCount(9); setAcceptDrops(true); setPalette(QPalette(QColor(250,150,210))); setAutoFillBackground(true); } void MyDropWidget::dragEnterEvent(QDragEnterEvent * event) { if(event->mimeData()->hasFormat("text/plain")) event->acceptProposedAction(); QTableWidget::dragEnterEvent(event); } void MyDropWidget::dropEvent(QDropEvent * event) { QString shape = event->mimeData()->text(); MyMessageBox mm("Drop "); mm.exec(); QTableWidget::dropEvent(event); } class Main_Widget:public QWidget { MyDragWidget * courses_DragWidget; MyDragWidget * rooms_DragWidget; MyDropWidget * timeTable_Widget; public: Main_Widget(); }; Main_Widget::Main_Widget() { courses_DragWidget = new MyDragWidget(NULL); timeTable_Widget = new MyDropWidget(NULL); QHBoxLayout * hBoxLayout = new QHBoxLayout; hBoxLayout->addWidget(courses_DragWidget,1); hBoxLayout->addWidget(timeTable_Widget,2); setLayout(hBoxLayout); } int main(int argc,char * argv[]) { QApplication app(argc,argv); Main_Widget * main_Widget = new Main_Widget; main_Widget->show(); main_Widget->resize(100,200); return app.exec(); } 

So, if QTableWidget accepts a drop, then the message β€œDrop” will appear in the message box. But, does not come => the fall is not accepted. Can someone help me on this?

Note. I am using Qt-4.7.2 on a Windows platform

+4
source share
1 answer

You need to do two things:

1) Paste dragMoveEvent . This happens when the drag introduced QWidget. An implementation might look like this:

 void MyDropWidget::dragMoveEvent(QDragMoveEvent *event) { event->accept(); } 

When you checked the mime drag and drop data as you type, there is no need to check it here, but you can check the area you want to get into.

2) Do not call the parent dragEnterEvent handler. So your dragEnterEvent function will look like this:

 void MyDropWidget::dragEnterEvent(QDragEnterEvent * event) { if(event->mimeData()->hasFormat("text/plain")) event->acceptProposedAction(); /* Don't need this.. QTableWidget::dragEnterEvent(event); */ } 

The reason is that QTableWidget supports its own form of drag and drop, so it will return the event back even if you accept it.

+6
source

All Articles