2016-06-07 2 views
3

Я пытаюсь создать приложение с кнопкой меню. Нажмите на кнопку, появится форма. Форма создается с использованием плагина. Проблема - при первом щелчке, одна форма генерируется как обычно. Но при втором щелчке еще 2 формы генерируются вместо одного. Третий клик дает еще 3 формы и так далее. Мне нужно только одну форму с каждым щелчком.Qt Слот сигнала в плагине Архитектура

 Is this has anything to do with Q_PLUGIN_METADATA(IID "Camel1") in interface? 

Это мое Применение mainwindow.cpp

 spPlugin *objSpPlugin=new spPlugin; 

      QSqlQuery qryPlugin=objSpPlugin->view_Plugin_Path(this,publicVariables::inEmployeeId,strFormName,evt::onLoad,true); 

      while(qryPlugin.next()) 
      { 


       QString 

    strPluginPath=qryPlugin.value("Plugin_Path").toString(); 
       qDebug()<<strPluginPath; 
       QDir pluginsDir(QDir::currentPath()+"/Plugin"); 

       QPluginLoader loader(pluginsDir.absoluteFilePath(strPluginPath)); 

       qDebug()<<loader.fileName(); 

       QObject *obj=loader.instance(); 
       qDebug()<<loader.errorString(); 
       if(obj) 
       { 

        MainwindowInterface *objMainWindowInterface=qobject_cast<MainwindowInterface *>(obj); 

        if(objMainWindowInterface) 
        { 
         connect(objMainWindowInterface,SIGNAL(CreateNewFormInstance(QWidget*)),SLOT(createNewFormInstance(QWidget*))); 

         objMainWindowInterface->run(); 


        } 

       } 

      } 



     void MainWindow::createNewFormInstance(QWidget*frmInstance) 
     { 

      qDebug()<<"createNewFormInstance"; 

       if(frmInstance!=NULL) 
       { 

        // 
       } 
       else 
       { 

        ui->mdiArea->addSubWindow(frmInstance); 
       } 
     } 


     My plugin InterFace included in pluginproduct.h 

     //#ifndef PLUGININTERFACE_H 
     //#define PLUGININTERFACE_H 

     //#include<QObject> 
     //#include<QWidget> 
     //#include<QtSql/QSqlQuery> 
     //#include<qsqldatabase.h> 


     class FormInterface:public QObject 
     { 

      Q_OBJECT 
     public: 
      virtual void Show()=0; 

     }; 





     Q_DECLARE_INTERFACE(MainwindowInterface,"Cam1") 


     //#endif // PLUGININTERFACE_H 




    My Pluginproduct.h 


     class LibPluginProductForm:public FormInterface 

     { 


      Q_OBJECT 
      Q_PLUGIN_METADATA(IID "Camel1") 
      Q_INTERFACES(FormInterface) 



     public: 
      LibPluginProductForm(); 

      ~ LibPluginProductForm(); 
      void Show(); 


     private: 

      QWidget *frm; 


     }; 


     my pluginProduct.cpp 


     LibPluginProductForm::LibPluginProductForm() 

     { 


     frm=new QWidget; 



     } 

     LibPluginProductForm::~LibPluginProductForm() 
     { 


     } 

     void LibPluginProductForm::Show() 

     { 


      emit CreateNewFormInstance(frm); 
      qDebug()<<"LibPluginProductForm::Show"; 


      frm->show();`enter code here` 

     } 
+0

Я решил решить проблему, добавив Qt :: Uniconnection в конец connect connect (objFormInterface, SIGNAL (CreateNewFormInstance (QWidget *)), SLOT (createNewFormInstance (QWidget *)), Qt :: UniqueConnection); –

ответ

0

Сигнал будет поднят, когда «CreaeNewFormInstance» называется, но и от LibPluginProduceForm :: Показать, где вы вручную «излучающий» сигнал.

Проверьте, что ваш метод «Show» не вызывается несколько раз. Вы видите инструкцию отладки в выводе приложения?

+0

CreaeNewFormInstance вызывается только из LibPluginProduceForm :: Показать метод –

+0

show Метод называется только один раз. –

+0

, когда я удаляю предыдущий объект pluginLoader при создании нового, это работает отлично .. но в то время я могу создать только одну форму, мне нужно использовать тот же плагин несколько раз, когда я нажимаю на свое меню, мне нужно собрать новый экземпляр того же плагин –

Смежные вопросы