2015-06-21 212 views
0

我需要让我的绘图板应用程序及其几何图形插件(绘制矩形,圆形等)相互通信: 当.so文件被加载时,主应用程序将得到一个具体的工厂实例图形类和一个按钮(将在主应用程序中加载以代表此图)。点击按钮后,应用程序可以绘制该图形。如何在Qt中的插件和主应用程序之间进行通信?

我愣神实现这个:

主要应用有QString身份弄清楚哪些客户选择。 我一个QString *point这点存储到这个QString的工厂和这样写代码:

QPushButton *CircleFactory::MyButton() 
{ 
    QPushButton *drawCircleBut = new QPushButton; 
    drawCircleBut->setIcon(QIcon(":/shape/circle")); 
    connect(drawCircleBut, SIGNAL(clicked()), this, SLOT(changeShape())); 
    return drawCircleBut; 
} 

void CircleFactory::changeShape() 
{ 
    *point = ID_LABEL; 
} 

我相信,一定有更好的方法来解决这个问题......请给我一些建议或意见。

回答

0

最简单的解决办法是利用QObject的财产制度:

QPushButton * CircleFactory::MyButton() 
{ 
    QScopedPointer<QPushButton> button(new QPushButton); 
    button->setIcon(QIcon(":/shape/circle")); 
    button->setProperty("identity", ID_LABEL); 
    return button->take(); 
} 

然后,在任何插槽连接到这些按钮,你可以很容易地检查他们的身份;

void Foo::buttonClicked() { 
    qDebug() << "clicked on:" << sender()->property("identity"); 
} 

这样你就避免了对全局变量的需求。

我质疑按钮需要以这种方式来识别自己。我担心的是你使用按钮的身份,然后以某种方式回引到圆圈对象或右侧插件。

相反,圆形工厂应该提供一个已经连接到适当插槽的按钮。如果这是不可能的,你将不得不进一步解释你的“绘图板应用程序”的设计和预期功能。正如你可能想象的那样,这样的应用程序应该如何工作还不是很明显 - 对你而言显而易见的是其他任何人都不明显。

+0

**非常感谢你!**我已阅读_design Patterns_由GoF的最近(说实话,昨天),我发现了一个名为“COMMAND”模式可以解决这个问题绝对是如果模型是为我写的:)我会在晚些时候编辑我的解决方案。最后,再次感谢〜 –

0

另一种解决方案是扩展几何图形插件接口,以便只有插件知道它们的形状如何被调用,以及它是如何表示的,如果它被表示为QIcon。应用程序本身不会了解有关圆形或矩形的任何内容。

#include <QString> 

class GeometricPluginInterface 
{ 
public: 
    GeometricPluginInterface() {} 
    virtual ~GeometricPluginInterface() {} 

    virtual QString name() const = 0; 
    virtual QIcon icon() const = 0; 

}; 

在应用程序的启动,你可以存储在一个QList(例如QList<GeometricPluginInterface*> m_plugins;)所有加载的插件。 如果你用按钮填充你的UI,你可以遍历列表并为每个插件创建一个QPushButton,这个插件有你从插件本身获得的图标。您可以通过lambda(自C++ 11以来)像代码中那样将按钮的clicked信号连接到插槽。

foreach (GeometricPluginInterface *plugin, m_plugins) { 
    QPushButton *button = new QPushButton; 
    button->setIcon(plugin->icon()); 
    connect(button, &QPushButton::clicked, 
      [this, plugin] { 
     geometryButtonClicked(plugin->name()); 
    }); 
    ui->buttonLayout->addWidget(button); 
} 

void GeometricPluginInterface::geometryButtonClicked(const QString &geometryName) 
{ 
    qDebug() << "Geometry clicked: " << geometryName; 
} 
相关问题