上一篇文章把插件加载好了,而且把插件中的全部控件都显示到了列表框中,此次要作的就是实现拖曳控件的功能,用户选择一个控件拖曳到画布上,松开,在松开位置处自动实例化该控件,这个须要用到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); }