如何在 qt 3 中使用小部件插件?
How to use a widget plugin in qt 3?
出于某些原因,我必须在 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
设计器没有在任何地方显示插件,也没有告诉我它无法创建相应的小部件。我绝对没有错误。
我该怎么办?
我在工作中得到了一位高级开发人员的帮助,实际上找到了解决这个问题的方法。这里的主要问题是确保插件没问题。我如何检查我的插件是否一切正常?这很简单。
首先,编译以下简单应用程序:
// 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
请注意,对于 LD_DEBUG 变量,除了 "all" 之外还有许多其他选项。只需输入
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 插件的生产(可能会模数一些改编)!
出于某些原因,我必须在 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
设计器没有在任何地方显示插件,也没有告诉我它无法创建相应的小部件。我绝对没有错误。
我该怎么办?
我在工作中得到了一位高级开发人员的帮助,实际上找到了解决这个问题的方法。这里的主要问题是确保插件没问题。我如何检查我的插件是否一切正常?这很简单。
首先,编译以下简单应用程序:
// 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
请注意,对于 LD_DEBUG 变量,除了 "all" 之外还有许多其他选项。只需输入
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 插件的生产(可能会模数一些改编)!