代码改变世界

Qt Designer 插件

2018-11-16 15:37  翻滚的雪球  阅读(2056)  评论(0编辑  收藏  举报

 

  这两天学习Qt案例Custom Widget Plugin Example,这是一个Qt Designer自定义控件。原则上,如果成功,它可以和Qt Designer 的其他控件一样拖放编辑。然而,在实践的过程中遇到了各种问题,虽然实现了编译和使用这种插件,但还是不能和Qt designer 自带控件那么方便。这里,我将遇到的一些坑写下来。

  起先,大家应该都一样,按案例默认配置编译。编译之后,新建一个项目,在Qt creater 设计里面期待出现一个新的控件条。然而想多了,没有。再看文档,编译之后要执行make install,将dll文件放在pro文件里设置的$$[QT_INSTALL_PLUGINS]/designer文件夹下,Qt Designer才能找到。用qmake -query 命令查看QT_INSTALL_PLUGINS变量为:C:/Qt/5.11.2/msvc2015_64/plugins,找到C:/Qt/5.11.2/msvc2015_64/plugins/designer, 里面果然没有该项目的dll。

  因此,在项目->build中做如下设置。

  执行之后,在C:/Qt/5.11.2/msvc2015_64/plugins/designer中找到该项目的dll。然而,新建一个项目,在Qt creator 的设计里面还是没有找到对应的控件。搜索发现,Qt creator 的设计选项和Qt Designer并不是一个东西,于是直接打开Qt Designer, 在其中找到相应控件。

  为了测试该控件是否可以和其他控件一样使用,利用vs新建一个Qt项目,将该条目拖入主窗口如下图所示。编译,出现三个错误提示:

1>c:\Users\dingchuang\documents\visual studio 2015\Projects\test_2\test_2\GeneratedFiles\ui_test_2.h(19): fatal error C1083: 无法打开包括文件: “analogclock.h”: No such file or directory
1>  main.cpp
1>c:\Users\dingchuang\documents\visual studio 2015\Projects\test_2\test_2\GeneratedFiles\ui_test_2.h(19): fatal error C1083: 无法打开包括文件: “analogclock.h”: No such file or directory
1>  test_2.cpp
1>c:\Users\dingchuang\documents\visual studio 2015\Projects\test_2\test_2\GeneratedFiles\ui_test_2.h(19): fatal error C1083: 无法打开包括文件: “analogclock.h”: No such file or directory

  其并不能像其他控件一样使用。

  参考这篇文章:https://blog.csdn.net/lhl1124281072/article/details/80039223,将文件analogclock.h和analogclock.cpp复制到新建项目的源代码目录下,如下图所示:

并添加到工程中:

然而,重新编译出现新的错误:

1>GeneratedFiles\Debug\moc_analogclock.cpp(58): warning C4273: “AnalogClock::qt_static_metacall”: dll 链接不一致
1>  c:\users\dingchuang\documents\visual studio 2015\projects\test_6\test_6\generatedfiles\debug\../../analogclock.h(59): note: 参见“qt_static_metacall”的前一个定义
1>GeneratedFiles\Debug\moc_analogclock.cpp(65): warning C4273: “staticMetaObject”: dll 链接不一致
1>  c:\users\dingchuang\documents\visual studio 2015\projects\test_6\test_6\generatedfiles\debug\../../analogclock.h(59): note: 参见“public: static QMetaObject const AnalogClock::staticMetaObject”的前一个定义
1>GeneratedFiles\Debug\moc_analogclock.cpp(65): error C2491: “AnalogClock::staticMetaObject”: 不允许 dllimport 静态数据成员 的定义
1>GeneratedFiles\Debug\moc_analogclock.cpp(72): warning C4273: “AnalogClock::metaObject”: dll 链接不一致
1>  c:\users\dingchuang\documents\visual studio 2015\projects\test_6\test_6\generatedfiles\debug\../../analogclock.h(59): note: 参见“metaObject”的前一个定义
1>GeneratedFiles\Debug\moc_analogclock.cpp(77): warning C4273: “AnalogClock::qt_metacast”: dll 链接不一致
1>  c:\users\dingchuang\documents\visual studio 2015\projects\test_6\test_6\generatedfiles\debug\../../analogclock.h(59): note: 参见“qt_metacast”的前一个定义
1>GeneratedFiles\Debug\moc_analogclock.cpp(85): warning C4273: “AnalogClock::qt_metacall”: dll 链接不一致
1>  c:\users\dingchuang\documents\visual studio 2015\projects\test_6\test_6\generatedfiles\debug\../../analogclock.h(59): note: 参见“qt_metacall”的前一个定义
1>  moc_test_6.cpp
1>  analogclock.cpp
1>analogclock.cpp(59): warning C4273: “AnalogClock::AnalogClock”: dll 链接不一致
1>  c:\users\dingchuang\documents\visual studio 2015\projects\test_6\test_6\analogclock.h(62): note: 参见“{ctor}”的前一个定义
1>analogclock.cpp(70): warning C4273: “AnalogClock::paintEvent”: dll 链接不一致
1>  c:\users\dingchuang\documents\visual studio 2015\projects\test_6\test_6\analogclock.h(65): note: 参见“paintEvent”的前一个定义

   查找errorc4273的原因,还是没有弄清楚原理,有大神请指导一下。但尝试去掉analogclock.h文件中的导出宏,将原来的

   class QDESIGNER_WIDGET_EXPORT AnalogClock : public QWidget 

   变为

   class AnalogClock : public QWidget 

   编译通过。运行结果: