上一篇文章把插件加載好了,而且把插件中的全部控件都顯示到了列表框中,此次要作的就是實現拖曳控件的功能,用戶選擇一個控件拖曳到畫布上,鬆開,在鬆開位置處自動實例化該控件,這個須要用到dropEvent和dragEnterEvent事件,從新實現這兩個事件,對拖曳的對象進行過濾並調用函數實例化該控件,在實例化該控件的同時實例化控件跟隨控件以便拉伸調整大小和位置。這裏須要注意的是dragEnterEvent是必須的,不少人覺得拖曳只要實現dropEvent就能夠了,其實不行的,沒有效果的,須要先dragEnterEvent來過濾好了執行event->accept()才行,否則根本沒有效果,不少人尤爲是初學者都掛在這裏,我就是在這裏摔了一跤,好疼! 體驗地址:https://pan.baidu.com/s/1A5Gd77kExm8Co5ckT51vvQ 提取碼:877p 文件:可執行文件.ziplinux
void frmMain::dropEvent(QDropEvent *event) { int row = listNames.indexOf(pressedItem); if (row < 0) { return; } //根據最後按下的控件位置生成控件 QPoint point = event->pos(); point.setX(point.x() - ui->centralwidget->x()); newWidget(row, point); } void frmMain::dragEnterEvent(QDragEnterEvent *event) { if(event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) { event->setDropAction(Qt::MoveAction); event->accept(); } else { event->ignore(); } } void frmMain::newSelect(QWidget *widget) { //實例化選中窗體跟隨控件一塊兒 SelectWidget *select = new SelectWidget(ui->centralwidget); connect(select, SIGNAL(widgetPressed(QWidget *)), this, SLOT(widgetPressed(QWidget *))); connect(select, SIGNAL(widgetRelease(QWidget *)), this, SLOT(widgetRelease(QWidget *))); connect(select, SIGNAL(widgetDelete(QWidget *)), this, SLOT(widgetDelete(QWidget *))); select->setWidget(widget); selectWidgets.append(select); } void frmMain::newWidget(int row, const QPoint &point) { //列表按照一樣的索引生成的,因此這裏直接對該行的索引就行 QWidget *widget = listWidgets.at(row)->createWidget(ui->centralwidget); widget->move(point); widget->resize(widget->sizeHint()); //實例化選中窗體跟隨控件一塊兒 newSelect(widget); //當即執行獲取焦點以及設置屬性 widgetPressed(widget); }