CentOS 7.0下Qt5.8实现和使用Qt Creaor自定义控件

CentOS 7.0下Qt5.8实现和使用Qt Creaor自定义控件

    这几天下了一些Qt源代码学习Qt的编程技巧,在看了lx100991(CSDN上的上传者,感谢)的“Qt自定义精美表盘控件”的源代码后,加上之前学习动态库积累的一点知识,萌生了把控件做成Qt可可视拖动控件的念头,自定义控件的创建和使用有两个办法,一个是提升法,这里不介绍,比较容易掌握;另一个,就是设计可以在Qt Creator里可拖拽的控件,这是本文的重点。

    我在网上搜了各种方法和例子,看了很多,都或多或少存在一些问题,主要表现在:

    一是大部分例子是window下的;

    二是部分人把创建动态库和创建自定义控件当成一回事了;

    三是编译过程中还一些问题需要处理,各类帖子没有描述;

    四是编译好后如何使用也有一些问题;

    这儿我把我走的弯路细细梳理了一下,估计新学者应该也会遇到,也为自己留个记号。为了把整个过程描述清楚,每一步我都做了记录,可能有些冗繁了,高手莫怪,飘过就可以了J。

    首先来张最后的实现后的效果图,我把lx100991的表盘控件做成了自定义控件,自己也随便做了一个,见图一。


图一 最终效果图

    废话不多说了,下面开始进入正题。

一、  开发环境

    虚拟机CentOS 7.0、Qt 5.8

二、  实现步骤

    1)打开Qt Creator点击菜单“文件”下“新建文件或项目”,然后选择好“其他项目”->“Qt4设计师自定义控件”开发选项,不要弄错,我开始把自定义控件理解成Qt Creator插架弄混了,第一步就卡了好久。如图一所示:


图二 新建文件或项目界面

    2)选择好后就点“Choose”进一步下一步。创建好自定义控件项目名称以及存放位置,我用lx100991的表盘为基础制作控件,所以我把项目命名为DasBoard然后点“下一步”。


图三 项目名称和创建路径设置

    3)进入构建套件配置,这里不做修改默认即可,直接 点“下一步”。


图四 构建套件配置

    4)进入自定义控件列表。这里主要是对自己设计的控件,进行定义。在控件类里输入类名,这里创建类名QDashBoard。设定好后右侧Tab栏选择,对QDashBoard进行设置,这里设置其父类为Qwdiget,QDashBoard这个类是你所有代码实现的地方,也就是你的自定义控件。其余【插件类名】、【插件头文件】、【插件源文件】不用修改,直接用默认就好。【图标文件】为自定义控件注册完成后,Qt控件列表中显示的控件图标,如需显示图标,必须在创建工程时,从这里引用。【说明】与【默认属性】Tab页,大家可自己根据实际情况编辑,默认页不影响控件使用(这里选择默认)。配置好后,点“下一步”。


图五 自定义控件列表

5)进入插件和集合类的信息页面,这里按照默认即可,点“下一步”。


图六 插件和集合类信息

    6)进入项目管理页面,不做任何修改,点“完成”。


图七 项目管理页

    7)创建好后,整个项目的文件结构如下图。Qt Creator一共创建了QDashBoard类以及QDashBoardPlugin类以及刚才选的资源文件:控件的图标。再强调一次QDashBoardPlugin类的所有信息暂时不用动(可能实现更多的功能要用到,一个帖子看到过介绍,但是实现一般的功能还不需要修改),QDashBoard类才是你实现功能的地方。


图八 项目结构图

    8)修改DashBoard.pro文件,把CONFIG += plugindebug_and_release,改成CONFIG += plugin release,因为只有release版本编译后的才能使用。

    9)到此为止就可以编译了,虽然什么功能都没有实现。这时会发现编译会产生一个warning。这个warning是:“Header<QtDesigner/QDesignerCustomWidgetInterface> is depreated.Please include<QtUiPlugin/QDesignerCustomWidgetInterface>。”如下图:


图九 第一个warning

    这个warning很好解决,就是在qdashboardplugin.h头文件中把

        #include < QDesignerCustomWidgetInterface > 改成

        #include <QtUiPlugin/QDesignerCustomWidgetInterface>即可。

    10)在QDashBoard类中实现自己的控件功能,这里我偷了个懒,把lx100991上传的精美表盘控件中的功能直接copy到了QDashBoard类中,这里不再赘述。再次编译后会得到控件的库文件,这里编译长生的库文件是ibqdashboardplugin.so。

    11)将libqdashboardplugin.so拷贝到Qt Creator plugin目录下,这个最坑人,Qt Creator下有很多plugin目录,试了很多遍才把libqdashboardplugin.so拷贝对地方,我的plugin目录位置是:

    /opt/Qt5.8.0/Tools/QtCreator/lib/Qt/plugins/designer

    这个一定要拷对,不然在Qt Creator中出不来。大家可以按照上面相对路径对进行拷贝,如果实在不行就把Qt Creator下只要有plugins目录的地方都试一遍,我是这么干的:(。另外,我也看到一篇文章中提出了在编译目录下(也就是生成libqdashboardplugin.so的那个目录)用控制台执行makeinstall命令,我试了,最终发现make install没把libqdashboardplugin.so拷对地方,在Qt Creator中依然看不到实现的控件。

12)重新运行Qt Creator这下你就可以看到你实现的自定义控件啦!效果见本文第一张图。

三、  使用自定义控件编程

    这里直接进入正题,创建一个工程,我建立一个MyTest工程,基于Qwidget的。把自定义QDashBoard控件拖拽到界面上,编译出现以下问题。

    1)qdashboard.hNo such file or directary,如图十所示。这个问题是,找不到qdashboard.h文件,这个好解决,把qdashboard.h拷贝到Qt的include目录下即可,我的Qt include目录是:/opt/Qt5.8.0/5.8/gcc_64/include


图十 找不到qdashboard.h

    2)这时再次编译会出现第二个问题:undefined reference to ‘QDashBoard::QDashBoard(QWidget)’。


图十一 无法使用QDashBoard

    估计大家基本上都会遇到这个问题。这个问题是因为Qt Creator找不到QDashBoard实现内容,也就是找不到libqdashboardplugin.so库的缘故。我想了半天也没想明白,libqdashboardplugin.so我不是正确拷到了Qt Creator目录下么?怎么就找不到了呢?后来我想了想我进行动态库使用时在编译时也遇到了这个情况,于是我就按照使用动态库的方法,把libqdashboardplugin.so进行包含,顺利解决问题。详细可见我的第一篇文章《linux下Qt动态库创建与调用学习笔记一(静态加载)》。解决步骤如下:

    A)     在MyTest.pro文件中加上:

            LIBS += -L/usr/mylib–lqdashboardplugin


图十二 LIBS配置

             /usr/mylib是我放置自己编译库的地方,大家可以随便建立,同时把libqdashboardplugin.so拷贝这个目录下。

    B)     在/etc/ld.so.conf中加入/usr/mylib,在控制台中执行ldconfig –v;

    C)     这时再次编译问题解决,ok。

四、  小结

    制作Qt Designer自定义控件,总体来说还是比较简单的,就是几个细节上的注意问题,再次说一下:一是生成的插件库文件一定要拷对地方,不然出不来;二是使用时头文件的包含以及库文件需要重新制定位置,要解决好。

    另外,在解决图十一 无法使用QDashBoard问题时,我也试过了将QDashBoard类的头文件、cpp文件都include到测试项目MyTest中(图十三中标绿的地方)这个方法也好用,只不过控件的实现都需要给使用者。

    到此结束。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值