【问题标题】:Qt Signal slot in plugin Architecture插件架构中的 Qt 信号槽
【发布时间】:2016-10-07 06:36:17
【问题描述】:

我正在尝试创建一个具有菜单按钮的应用程序。 单击按钮后,将出现一个表单。 表单是使用插件创建的。问题是—— 第一次单击时,会正常生成一个表单。但是在第二次单击时,会生成另外 2 个表单而不是一个。第 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`

        }

【问题讨论】:

  • 我通过在连接末尾添加 Qt::Uniconnection 解决了上述问题 connect(objFormInterface,SIGNAL(CreateNewFormInstance(QWidget*)),SLOT(createNewFormInstance(QWidget*)),Qt::UniqueConnection);

标签: c++ qt signals-slots plugin-architecture qtplugin


【解决方案1】:

当调用 'CreaeNewFormInstance' 时会发出信号,但也会从 LibPluginProduceForm::Show 您手动“发出”信号的位置发出。

检查您的“显示”方法是否被多次调用。您是否在应用程序输出中看到您的调试语句?

【讨论】:

  • CreaeNewFormInstance 仅从 LibPluginProduceForm::Show 方法调用
  • 当我在创建新对象的同时删除以前的 pluginLoader 对象时,这非常有效。但是那时我只能创建一个表单,我需要多次使用相同的插件,因为我点击了我需要的菜单为同一插件创建一个新实例
  • 调试语句也可见
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 2020-10-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2012-02-08
相关资源
最近更新 更多