无法从插件(.so)加载Qt UI(带图像)

时间:2011-02-23 21:04:42

标签: qt plugins qwidget

我有一个加载并显示自定义窗口小部件的插件,该窗口小部件显示从资源文件(resources.qrc)加载的图像(作为QLabel的背景)。我面临的问题是,一旦加载了插件,它就会正确显示小部件,但不会显示图像。我尝试到处都放“Q_INIT_RESOURCE(资源)”,但没有任何反应。我已经创建了许多自定义小部件,它们使用qrc文件来显示图像,但只能直接在应用程序中运行,它们运行得很好。这个时间来自一个插件,所以我必须在这里找到一些东西。有什么帮助吗?

// TheInterface.h
class TheInterface
{
    ...
}
Q_DECLARE_INTERFACE(TheInterface,"com.system.subsystem.TheInterface/1.0");



// MyWidget.h
class MyWidget : public QWidget, public Ui::MyWidget
{
    Q_OBJECT
    ...
}



// MyPlugin.h
#include "TheInterface.h"
class MyPlugin : public QOBject,
                 public TheInterface
{
    Q_OBJECT
    Q_INTERFACES(TheInterface)

    ...
};

// MyPlugin.cpp
#include "MyPlugin.h"
#include "MyWidget.h"
MyPlugin::MyPlugin()
{
    MyPlugin* w = new MyPlugin();
    w->show();
}

Q_EXPORT_PLUGIN2(myplugin, MyPlugin)

1 个答案:

答案 0 :(得分:5)

问题解决了。

问题是主应用程序已经有一个同名的qrc文件(resources.qrc)。插件 - 由主应用程序加载 - 有一个不同的resources.qrc文件,但由于主应用程序有一个已经具有相同名称,它没有加载它。我更改了插件中资源文件的名称并且工作得很好。当然,我必须将从Q_INIT_RESOURCE( resources );类(Q_INIT_RESOURCE( new_resource_file_basename );)的构造函数调用的MyWidget更改为MyWidget::MyWidget()。换句话说,它不需要在插件的构造函数中(MyPlugin::MyPlugin())。这是有道理的,因为MyWidget类是使用资源文件的类,而不是插件。