标题:Qt自定义控件,制作的ui文件,不能使用UILoader加载!
作者:zxh1982a
日期:2012-11-03 20:56
内容:
如题,我自己创建了两个Qt控件,使用Qt界面设计师生成的ui文件编译使用完全正常。
但使用UILoader::load()时调试控制台提示如下:
"QFormBuilder was unable to create a custom widget of the class 'CCSTableView'; defaulting to base class 'QTableView'."
"QFormBuilder was unable to create a custom widget of the class 'CCSDataModel'; defaulting to base class 'QWidget'."
不能正常使用!
细想一下也是,UILoader并不认识我的类,无法创建出我的CCSTableView、CCSDataModel类。
想问下论坛里的高手们有什么方法让UILoader能加载我算定的控件吗?
#1 [zxh1982a 11-03 21:14]
看了一下Qt的文档QUILoader有一个添加addPluginPath 方法:说明如下:
Adds the given path to the list of paths in which the loader will search when locating plugins.
又找到一个地方:
To make a custom widget available to the loader, you can use the addPluginPath() function; to remove all available widgets, you can call the clearPluginPaths() function.
我的理解按文档说的是指定插件的路径可以加载自定义控件的。
贴上代码:
loader.addPluginPath("E:\\code\\qt\\csgui\\release\\"); //我编译的插件dll的路径
QWidget* w = loader.load(&file);
CCSTableView* pView = w->findChild("cCSTableView");
pView->open();
w->show();
修改了代码仍然不行!。 将路径改为E:\\code\\qt\\csgui\\release\\xxx.dll也是一样。没有任何改变。
我自定义的控件的信号槽全部失败,以下是load时提示的调试信息:
Object::connect: No such signal QTableView::queryModel(QString,bool)
Object::connect:(sender name: 'cCSTableView')
Object::connect:(receiver name: 'cCSDataModel')
Object::connect: No such slot QTableView::setOpen(bool)
Object::connect:(sender name: 'pushButton')
Object::connect:(receiver name: 'cCSTableView')
Object::connect: No such slot QTableView::setOpen(bool)
Object::connect:(sender name: 'checkBox')
Object::connect:(receiver name: 'cCSTableView')
#2 [roywillow 11-03 21:17]
会不会是你自己的类的meta object的信息不完整?【只是猜测
#3 [zxh1982a 11-03 22:56]
发现了一个自己的错误,我调试的debug程序,用的是release的插件dll,所有在loader.addPluginPath()时会报错,改成debug路径就对了。
但还是有个问题,从load返回的QWidget 中死活find不到我自己的控件指针,返回总是NULL.
使用QStringList availableWidgets = loader.availableWidgets(); 返回的列表中都有我自己的控件类型
#4 [zxh1982a 11-03 23:39]
哈哈,终于搞定了!
原来是这样:我有两个工程,一个插件dll工程,一个exe界面工程。
QWidget 中死活find不到我自己的控件指针是因为,我的exe工程是将dll工程中的控件xxx.h文件和xxx.cpp文件直接包含到工程中进行编译的。相当于QUILoader加载了一次dll中编译的自定义控件类,exe程序中又编译出来一个同名的类。
我将dll插件中的类导出,exe工程以库的形式使用dll中的类头文件和lib文件编译,OK! 一切和想像一样完美!
一不知道大家看出我做的这个两个控件的功能没有?这是我突然一个灵感想到的。
公司做一个项目,其中有很多的表视图。我想的是让UI设计时就将一个tableview和model绑定起来!就不需要在程序中将代码写死了,并且是用UILoader方式,就算是编译成二进制文件了,我还可以修改界面中那个地方的表格显示什么内容。
#5 [一条叼咸鱼 02-06 11:08]
QUiLoader loader;
QFile file("C:/Users/Administrator/Desktop/untitled/Catalogs.ui");
loader.addPluginPath("C:/Users/Administrator/Desktop/untitled/Clockplugind.dll");
file.open(QFile::ReadOnly);
QWidget *myWidget = loader.load(&file, this);
QStringList availableWidgets = loader.availableWidgets();
if (availableWidgets.contains("Clock"))
qDebug()