2015-06-21 87 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; 
} 
相關問題