Qt官方范例中,使用QUiLoader加载UI文件,结合插件的问题。

caiwei_cs 2017-08-04 02:54:57
官方范例1:Calculator Builder Example 中有如下代码:
    QUiLoader loader;

QFile file(":/forms/calculatorform.ui");
file.open(QFile::ReadOnly);
QWidget *formWidget = loader.load(&file, this);
file.close();

ui_inputSpinBox1 = findChild<QSpinBox*>("inputSpinBox1");
ui_inputSpinBox2 = findChild<QSpinBox*>("inputSpinBox2");
ui_outputWidget = findChild<QLabel*>("outputWidget");

实现了,动态加载UI文件,并且通过findChild查找到UI文件中的控件,能够对控件做进一步的操作。

官方范例2:World Time Clock Builder Example 中也用QUiLoader加载UI文件,并且文件中包含插件生成的控件,WorldTimeClock(插件在官方范例 World Time Clock Plugin Example中生成)。我希望像第一个范例一样,能够查找并使用UI文件中的控件。
    QFile file(":/forms/form.ui");
file.open(QFile::ReadOnly);

QWidget *widget = loader.load(&file);
//自己加入—begin
//qt自带控件可以
QLabel_currentTime = widget->findChild<QLabel*>("label");

qDebug()<<ui_label_currentTime->text();
ui_label_currentTime->setText("lala");

//插件加入的控件,报错
WorldTimeClock * ui_clock;
ui_clock = widget->findChild<WorldTimeClock*>("worldTimeClock");
qDebug()<<ui_clock->metaObject()->className();
ui_clock->setTimeZone(2);
//自己加入-end

file.close();
widget->show();

范例位置:$$[QT_INSTALL_EXAMPLES]/designer/worldtimeclockbuilder
报错:
D:\Qt\Qt5.5.1\Examples\Qt-5.5\designer\worldtimeclockbuilder\main.cpp:77: error: undefined reference to `_imp___ZN14WorldTimeClock11setTimeZoneEi'

虽然我将生成插件的工程中的头文件应用过来,或者拷贝过来还是不行。
//#include "../../../../Examples/Qt-5.5/designer/worldtimeclockplugin/worldtimeclock.h"
#include "worldtimeclock.h"

我想问的是
如何实现对UI文件中插件控件,例如上面的worldtimeclock,也能像自带控件一样修改被引用使用。否则觉得灵活性太差,用插件没什么意义。

另外:用插件生成的控件,只能在QDesigner中使用,在QtCreator中不行?好像在哪里看到,Qt原版用vs编译的,所以mingw下QDesignerCustomWidgetInterface插件是不能在Qtcreator中用?
...全文
1286 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
caiwei_cs 2017-08-10
  • 打赏
  • 举报
回复
引用 6 楼 dext 的回复:
lib 是 MSVC 的那一套,mingw 是没有的,它可以直接连接DLL
我用 http://www.qtcn.org/bbs/read-htm-tid-62335.html的方法,没有全部尝试,但是将dll和h文件拷贝以后至少是可以引用的。
dext 2017-08-10
  • 打赏
  • 举报
回复
lib 是 MSVC 的那一套,mingw 是没有的,它可以直接连接DLL
caiwei_cs 2017-08-09
  • 打赏
  • 举报
回复
引用 1 楼 dext 的回复:
你连接 了 worldtimeclockplugin.dll 么?这个文件 有点特殊,兼顾库 和插件。所以需要连接一下。
我编译以后只生成了dll文件,没有lib文件。将dll文件的release版本和debug版本拷贝到,qt的plugins\designer目录下,和creator的bin\plugins\designer下。 然后。。。。,就没有然后了。creator上面不能加载这个插件。
caiwei_cs 2017-08-09
  • 打赏
  • 举报
回复
引用 1 楼 dext 的回复:
你连接 了 worldtimeclockplugin.dll 么?这个文件 有点特殊,兼顾库 和插件。所以需要连接一下。
怎么链接阿?我是将dll拷贝到qt的plugins\designer下。不过其他东西就不知道怎么继续了,能不能指点以下阿,或者网上有没有合适的文章?
caiwei_cs 2017-08-09
  • 打赏
  • 举报
回复
引用 2 楼 qqwangfan 的回复:
你的错误应该是没有找到插件的lib库或者该函数的实现,你可以直接把自定义的.h和.cpp文件放到当前工程目录下,再将对应的自定义插件的dll动态库拷到qt的plugins\designer目录下,这样就能像qt的控件一样使用了。
将dll拷贝到qt的插件目录下,是没问题的,不过将。h和。cpp拷贝到当前工程目录下,重新编译,就会报一样的错误。 这里应该不是这样用。
  • 打赏
  • 举报
回复
你的错误应该是没有找到插件的lib库或者该函数的实现,你可以直接把自定义的.h和.cpp文件放到当前工程目录下,再将对应的自定义插件的dll动态库拷到qt的plugins\designer目录下,这样就能像qt的控件一样使用了。
dext 2017-08-04
  • 打赏
  • 举报
回复
你连接 了 worldtimeclockplugin.dll 么?这个文件 有点特殊,兼顾库 和插件。所以需要连接一下。

16,173

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧