温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Qt如何实现拖曳控件

发布时间:2021-12-15 10:17:31 来源:亿速云 阅读:797 作者:小新 栏目:互联网科技

这篇文章主要介绍Qt如何实现拖曳控件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一、前言

上一篇文章把插件加载好了,并且把插件中的所有控件都显示到了列表框中,这次要做的就是实现拖曳控件的功能,用户选择一个控件拖曳到画布上,松开,在松开位置处自动实例化该控件,这个需要用到dropEvent和dragEnterEvent事件,重新实现这两个事件,对拖曳的对象进行过滤并调用函数实例化该控件,在实例化该控件的同时实例化控件跟随控件以便拉伸调整大小和位置。这里需要注意的是dragEnterEvent是必须的,很多人以为拖曳只要实现dropEvent就可以了,其实不行的,没有效果的,需要先dragEnterEvent来过滤好了执行event->accept()才行,不然根本没有效果,很多人尤其是初学者都挂在这里,我就是在这里摔了一跤,好疼!

二、实现的功能

  1. 自动加载插件文件中的所有控件生成列表,默认自带的控件超过120个。

  2. 拖曳到画布自动生成对应的控件,所见即所得。

  3. 右侧中文属性栏,改变对应的属性立即应用到对应选中控件,直观简洁,非常适合小白使用。

  4. 独创属性栏文字翻译映射机制,效率极高,可以非常方便拓展其他语言的属性栏。

  5. 所有控件的属性自动提取并显示在右侧属性栏,包括枚举值下拉框等。

  6. 支持手动选择插件文件,外部导入插件文件。

  7. 可以将当前画布的所有控件配置信息导出到xml文件。

  8. 可以手动选择xml文件打开控件布局,自动根据xml文件加载控件。

  9. 可拉动滑动条、勾选模拟数据复选框、文本框输入,三种方式来生成数据应用所有控件。

  10. 控件支持八个方位拉动调整大小,自适应任意分辨率,可键盘上下左右微调位置。

  11. 打通了串口采集、网络采集、数据库采集三种方式设置数据。

  12. 代码极其精简,注释非常详细,可以作为组态的雏形,自行拓展更多的功能。

  13. 纯Qt编写,支持任意Qt版本+任意编译器+任意系统。

三、效果图

Qt如何实现拖曳控件

四、核心代码

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);
}

以上是“Qt如何实现拖曳控件”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

qt
AI