我正在构建一个严重依赖插件的应用程序:核心从串行接口获取数据并将其传递给每个插件,以便每个人都可以决定如何处理它。
我的设计允许插件构建一个通过 QMdiSubWindow 附加到 MDIArea 的 Widget。这一直有效,直到我需要互斥锁,因为一切都在同一个线程中运行,所以我很快就陷入了死锁。所以我认为将每个插件移动到不同的线程可以解决这个问题。问题是(目前),不再创建 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 );
}