Слот Qt Signal в архитектуре плагина

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

        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`

        }

person mukthar ali    schedule 07.06.2016    source источник
comment
Я решил вышеуказанную проблему, добавив Qt :: Uniconnection в конце подключения connect (objFormInterface, SIGNAL (CreateNewFormInstance (QWidget *)), SLOT (createNewFormInstance (QWidget *)), Qt :: UniqueConnection);   -  person mukthar ali    schedule 05.07.2016


Ответы (1)


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

Убедитесь, что ваш метод Show не вызывается несколько раз. Вы видите свой отладочный оператор в выходных данных приложения?

person SPlatten    schedule 07.06.2016
comment
CreaeNewFormInstance вызывается только из метода LibPluginProduceForm :: Show - person mukthar ali; 08.06.2016
comment
когда я удаляю предыдущий объект pluginLoader при создании нового, это работает отлично ... но в этот раз я могу создать только одну форму, мне нужно использовать один и тот же плагин несколько раз, когда я нажимаю на свое меню, мне нужно создать новый экземпляр того же плагина - person mukthar ali; 08.06.2016
comment
оператор отладки также виден - person mukthar ali; 08.06.2016