プラグインに大きく依存するアプリケーションを構築しています。コアはシリアル インターフェイスからデータを取得し、それを各プラグインに配信して、それぞれがそれをどう処理するかを決定できるようにします。
私の設計では、QMdiSubWindow を介して MDIArea にアタッチされたウィジェットをプラグインで構築できます。これは、ミューテックスが必要になるまで機能しました。すべてが同じスレッドで実行されていたため、非常に速くデッドロックが発生しました。したがって、各プラグインを別のスレッドに移動すると、これを解決できると思いました。問題は、(今のところ) QMdiSubWindow がもう作成されていないことです。なぜこれが起こっているのかわかりません。
コアは、シグナルとスロットを使用してプラグインと通信します。
これは、プラグインをロードしてスレッドに移動する方法です。
QPluginLoader loader( the_path );
QObject* plugin = loader.instance();
if( plugin!=0 )
{
//Connect install subwindows request
connect( plugin, SIGNAL(install_plugin_window(QString,QWidget*)), this, SLOT(onRequestInstallSubwindow(QString,QWidget*)) );
QThread* consumer = new QThread;
plugin->moveToThread( consumer );
consumer->start();
PluginInterface* pl = qobject_cast<PluginInterface*>(plugin);
pl->registerSubWindow();
}
これは元のコードを簡略化したものであることに注意してください。この記事http://www.christeck.de/wp/2010/10/23/the-great-qthread-mess/に基づいて、このアプローチ(プラグインをスレッドに移動)に従いました
registerSubWindow() は、ウィジェットを作成するプラグインのメソッドです。
void PluginDrier::registerSubWindow()
{
widget = new Form();
emit install_plugin_window( "Plugin Widget", widget );
}
これは、生成されたウィジェットを上記の MdiSubWindow として登録する、このスロットでコアによってキャッチされるシグナルを発します。
void MainWindow::onRequestInstallSubwindow( QString title, QWidget* content )
{
QMdiSubWindow* subwindow = ui->mdiArea->addSubWindow( content );
subwindow->setWindowTitle( title );
subwindow->setWindowFlags( Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint );
}