2011-12-13 8 views
0

プラグインにロードしようとしています。それらが成功すると、返されたウィジェットを接続する必要があります。QObject :: connect:接続できません(null)

1つのプラグインでは、アクションを作成してメニューに追加します。別のプラグインでは、ラベルを作成してウィンドウに追加します。実行時にこのエラーが発生しても(プラグインがロードされると)、これらの2つのウィジェットが作成され、表示されます。しかし、それらの間には何の関係もありません。

私は

QObject *plugin = pluginLoader.instance(); 
if (plugin) { 
    myAction = qobject_cast<ActionInterface *>(plugin); 

    if (myAction) { 
     pluginMenu->addAction(myAction->newAction()); 
     verify ++; 
    } 

    myLabel = qobject_cast<LabelInterface *>(plugin); 

    if (myLabel) {    
     layout->addWidget(myLabel->newLabel()); 
     verify++; 
    } 

    if (verify == 2) 
     connect(myAction, SIGNAL(pushMyAction()), 
      myLabel, SLOT(setTextforLabel())); 
    } 

    ... 
} 

エラーメッセージウィジェットを接続しようとどのようにこれはです:

のQObject ::接続:接続できません(ヌル):: LabelPlugin :: setTextforLabelにpushMyAction()( )

+0

ここでは、ベリファイを0に設定すると表示されません。したがって、前回のベリファイから1の値を引き継いでいます。 nullの場合、myActionがnullであっても2になります。それ以外の場合は、verifyが2でmyActionがnullの場合は...他の何かがここで間違っています... – HostileFork

+0

@HostileForkクラスコンストラクタMainWindow :: MainWindow()に設定します。 ...} – develoops

+0

このコードでは、 'myAction'と' myLabel'の両方がnullでないことを確認するために検証カウントを使用している点はありませんか?このコードを実行するたびにリセットしないと、その保証は提供されません。ヌルオブジェクトポインタは接続できません。 – HostileFork

答えて

2
QObject *plugin = pluginLoader.instance(); 
if (plugin) { 

    if (plugin->inherits("ActionInterface")) { 
     myAction = qobject_cast<ActionInterface *>(plugin); 
     pluginMenu->addAction(myAction->newAction()); 
    } 

    if (plugin->inherits("LabelInterface")) {    
     myLabel = qobject_cast<LabelInterface *>(plugin); 
     layout->addWidget(myLabel->newLabel()); 
    } 

    if (myLabel && myAction) 
     connect(myAction, SIGNAL(pushMyAction()), 
      myLabel, SLOT(setTextforLabel())); 
    } 

    ... 
} 

この「醜い」確認カウンタを削除します。 myLabelとmyActionをNULLで初期化することを忘れないでください。

3

プラグインは2種類あります。明らかに、一方はActionInterfaceにキャストできますが、LabelInterfaceにキャストすることはできません。もう一方はLabelInterfaceにキャストすることはできますが、ActionInterfaceにキャストすることはできません。

あなたの考えは、両方のプラグインを読み込んだら(そして2のベリファイカウント)、これらのプラグイン間で接続コールをすることは安全です。しかし、あなたはとして、信号とスロットの両方をとして配信するために、2番目に読み込まれたプラグインをキャストしようとしているようです。これは、コードを実行するたびにmyActionmyLabelの両方を上書きするためです。したがって、最低でも:

QObject* plugin = pluginLoader.instance(); 
if (plugin) { 
    ActionInterface* myActionTemp = qobject_cast<ActionInterface*>(plugin); 

    if (myActionTemp) { 
     myAction = myActionTemp; 
     pluginMenu->addAction(myAction->newAction()); 
     verify++; 
    } 

    LabelInterface* myLabelTemp = qobject_cast<LabelInterface*>(plugin); 

    if (myLabelTemp) { 
     myLabel = myLabelTemp;    
     layout->addWidget(myLabel->newLabel()); 
     verify++; 
    } 

    /* if (myAction and myLabel) would be less convoluted... */ 
    if (verify == 2) { 
     connect(myAction, SIGNAL(pushMyAction()), 
      myLabel, SLOT(setTextforLabel())); 
    } 

    ... 
} 

まだ、これは若干の再考をする可能性のあるかなり脆弱なデザインのように見えます。

+1

正直言って、著者があなたの答えの後に達成したい質問を理解しました。 +1は、欠陥のある設計を誤ってしまうという誤解を招く。 –

関連する問題