0

何らかの理由で、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

デザイナーはプラグインをどこにも表示せず、対応するウィジェットを作成できなかったことも教えてくれません。エラーはまったく発生しません。

私は何をすべきか?

4

1 に答える 1

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

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 プラグインの生成にも適用できることに注意してください (おそらく、いくつかの適応をモジュロします)!

于 2015-05-21T13:53:51.840 に答える