我正在做一个使用QTableWidget的项目。 当我试图让它接受滴,我知道它不像我想象的那样。 问题是,如果我将QTableWidget改成QWidget,那么drop就被接受了。 所以,这个问题不在编码中。 这里是代码,至于我关心的问题是在“MyDropWidget”类
#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(); }
所以,如果QTableWidget接受放置,那么一个消息框会出现一个消息“Drop”。 但是,是不是未来=>下降不被接受。 有谁能帮我解决这个问题吗?
注意:我在windows平台上使用Qt-4.7.2
有两件事你需要做:
1)实现dragMoveEvent 。 这是当拖动进入QWidget时。 一个实现可能看起来像这样:
void MyDropWidget::dragMoveEvent(QDragMoveEvent *event) { event->accept(); }
当你输入拖动MIME数据时,不需要再次检查,但是你可以检查你想要放入的区域。
2)不要调用父DragEnterEvent处理程序。 所以你的dragEnterEvent函数就像这样:
void MyDropWidget::dragEnterEvent(QDragEnterEvent * event) { if(event->mimeData()->hasFormat("text/plain")) event->acceptProposedAction(); /* Don't need this.. QTableWidget::dragEnterEvent(event); */ }
原因是,QTableWidget支持它自己的拖放形式,因此即使您接受它,它也会将事件设置为被拒绝。