2011-12-13 79 views
0

我嘗試加載到插件。如果他們加載成功,那麼我必須連接返回的小部件。QObject :: connect:無法連接(null)

使用一個插件我創建一個動作並將其添加到菜單,另一個插件創建一個標籤並將其添加到窗口。即使我在運行時(應用程序加載插件時)出現此錯誤,這兩個小部件也會創建並可見。但他們之間沒有任何聯繫。

這是我嘗試連接部件

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 ::連接:無法連接(空):: pushMyAction()來LabelPlugin :: setTextforLabel( )

+0

我們在這裏沒有看到將驗證設置爲0的位置。因此,也許您從前一個驗證中提取值爲1 ...它會加1,因爲myLabel不是null,然後即使myAction爲null,也可以在2處擁有它。否則,如果驗證是2和myAction爲空...這裏有其他錯誤... – HostileFork 2011-12-13 17:37:25

+0

@HostileFork我在類的構造函數中設置它MainWindow :: MainWindow(){驗證= 0; ...} – develoops 2011-12-13 17:42:15

回答

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())); 
    } 

    ... 
} 

刪除這個「醜陋的」驗證計數器。請記住用NULL初始化myLabel和myAction

3

你有兩個不同的插件。顯然可以投射到ActionInterface而不是LabelInterface,另一個投射到LabelInterface而不是ActionInterface

你的想法在這裏似乎是,一旦你有兩個插件加載(和驗證計數爲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())); 
    } 

    ... 
} 

不過,這看起來像一個相當脆弱的設計,可以使用一些反思...!

相關問題