• 10317阅读
  • 5回复

[讨论]Qt自定义控件,制作的ui文件,不能使用UILoader加载! [复制链接]

上一主题 下一主题
离线zxh1982a
 

只看楼主 倒序阅读 楼主  发表于: 2012-11-03
如题,我自己创建了两个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能加载我算定的控件吗?

离线zxh1982a

只看该作者 1楼 发表于: 2012-11-03
看了一下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*>("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')
离线roywillow

只看该作者 2楼 发表于: 2012-11-03
会不会是你自己的类的meta object的信息不完整?【只是猜测
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线zxh1982a

只看该作者 3楼 发表于: 2012-11-03
发现了一个自己的错误,我调试的debug程序,用的是release的插件dll,所有在loader.addPluginPath()时会报错,改成debug路径就对了。

但还是有个问题,从load返回的QWidget 中死活find不到我自己的控件指针,返回总是NULL.

使用QStringList availableWidgets = loader.availableWidgets(); 返回的列表中都有我自己的控件类型
离线zxh1982a

只看该作者 4楼 发表于: 2012-11-03
哈哈,终于搞定了!

原来是这样:我有两个工程,一个插件dll工程,一个exe界面工程。
QWidget 中死活find不到我自己的控件指针是因为,我的exe工程是将dll工程中的控件xxx.h文件和xxx.cpp文件直接包含到工程中进行编译的。相当于QUILoader加载了一次dll中编译的自定义控件类,exe程序中又编译出来一个同名的类。

我将dll插件中的类导出,exe工程以库的形式使用dll中的类头文件和lib文件编译,OK! 一切和想像一样完美!

一不知道大家看出我做的这个两个控件的功能没有?这是我突然一个灵感想到的。
公司做一个项目,其中有很多的表视图。我想的是让UI设计时就将一个tableview和model绑定起来!就不需要在程序中将代码写死了,并且是用UILoader方式,就算是编译成二进制文件了,我还可以修改界面中那个地方的表格显示什么内容。




只看该作者 5楼 发表于: 2021-02-06
   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()<<"Clock";
请问为什么这样做加载不了时钟控件呢?
快速回复
限100 字节
 
上一个 下一个