如何在qt 3中使用widget插件?

时间:2015-05-20 14:36:08

标签: plugins designer qt3

出于某些原因,我必须在SLES 11 SP3下使用Qt3。我写了以下插件:

// PixmapButtonPlugin.hpp
#include <qwidgetplugin.h>

class PixmapButtonPlugin : public QWidgetPlugin
{
  public:
    QStringList keys () const;
    QWidget* create (const QString& key, QWidget* parent = 0, const char* name = 0);
    QString group (const QString& key) const;
    QIconSet iconSet (const QString& key) const;
    QString includeFile (const QString& key) const;
    QString toolTip (const QString& key) const;
    QString whatsThis (const QString& key) const;
    bool isContainer (const QString& key) const;
};
Q_EXPORT_PLUGIN(PixmapButtonPlugin)


// PixmapButtonPlugin.cpp
#include "PixmapButtonPlugin.hpp"
#include "PixmapButton.qh"

QStringList PixmapButtonPlugin::keys () const
{
  return QStringList() << "PixmapButton";
}

QWidget* PixmapButtonPlugin::create (const QString&, QWidget* parent, const char*)
{
  return new PixmapButton(parent);
}

QString PixmapButtonPlugin::group (const QString&) const
{
  return "Buttons";
}

QIconSet PixmapButtonPlugin::iconSet (const QString& key) const
{
  return QWidgetPlugin::iconSet(key);
}

QString PixmapButtonPlugin::includeFile (const QString&) const
{
  return "PixmapButton.qh";
}

QString PixmapButtonPlugin::toolTip (const QString&) const
{
  return "Pixmap button";
}

QString PixmapButtonPlugin::whatsThis (const QString&) const
{
  return "Button that takes the shape of its pixmap";
}

bool PixmapButtonPlugin::isContainer (const QString&) const
{
  return false;
}

我终于在文件夹

中复制了已编译的共享库libplugins.so
/usr/lib/qt3/plugins/designer

设计人员不会在任何地方显示插件,也不会告诉我它也无法创建相应的小部件。我绝对没有错误。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

我在高级开发人员的工作中得到了一些帮助,实际上找到了摆脱这个问题的方法。这里的主要问题是确保插件没问题。如何检查我的插件一切正常?这非常简单。

首先,编译以下简单应用程序:

// PluginLoader.cpp
#include <iostream>
#include <qlibrary.h>
#include <private/qcom_p.h>

int main(int argc, char *argv[])
{
  QLibrary lib("/path-to-my-plugin/myPlugin.so");
  std::cout << "Load: " << lib.load() << std::endl;
  std::cout << "Resolve: " << (lib.resolve("ucm_instantiate") != 0) << std::endl;

  return 0;
}

其次,为库激活一些调试工具:在控制台中键入以下命令

export LD_WARN=1
export LD_VERBOSE=1
export LD_DEBUG=all

请注意,还有许多其他选项,而不是&#34;所有&#34;对于LD_DEBUG变量。只需输入

即可
export LD_DEBUG=help

获取更多详细信息(一旦启动上述应用程序,您将获得详细信息)。

然后,启动PluginLoader应用程序

./PluginLoader 2> loader.log

文件loader.log随后将包含有关正在加载的库的所有详细信息,特别是以

开头的消息
symbol lookup error

表示插件中缺少某些内容。

当PluginLoader满意时,即当它说

Load: 1
Resolve: 1

您通常可以在Qt Designer中使用该插件。要使用它,请将其复制到文件夹

/usr/lib/qt3/plugins/designer

$QTDIR/plugins/designer

这是设计人员插件的默认文件夹。您也可以通过设置

来取得成功
LD_LIBRARY_PATH
QT_PLUGIN_PATH

适当。

通常,你也可以简单地

ldd /path-to-your-plugin/myPlugin.so

这将显示此插件链接的库。这可以为您提供有关您可能忘记的库的信息......

最后的评论。我正在开发SLES 11 SP3 64位。但是,我正在编译32位应用程序。特别是,插件是32位。在尝试让插件出现在设计器中之前,请确保设计器是32位版本。否则,该插件不会出现在列表中。

另请注意,此过程也可以应用于Qt4和Qt5插件的制作(可能采用模块化的几种方式)!