首先,它的消息和顯示小部件是兩個單獨的東西。將它們壓在一起是嚴重的設計錯誤。
一個典型的解決方案會有某種記錄器/消息接收器,它是一個單一的語義,但不一定使用單例模式實現。接收器可以是QObject
,以便您可以輕鬆地將消息源連接到接收器。接收器可以被附加到一個或多個顯示小部件。
感謝QObject
以及qApp
是全局實例指針,QCoreApplication
是QObject
這一事實,因此很容易將水槽穿過。因此,你可以:
通過動態屬性系統傳遞指針,或
使水槽的全局應用程序對象的唯一的孩子。
查看下面的例子。請注意,Widget
只需要知道MessageSink
類的聲明。它不需要明確地傳遞任何實例。原來的單身模式也不是。
class MessageSink : public QObject {
Q_OBJECT
public:
MessageSink(QObject * parent = 0) : QObject(parent) {}
Q_SIGNAL void message(const QString &);
static MessageSink * instance() { return qApp->findChild<MessageSink*>(); }
}
class Widget : public QWidget {
QVBoxLayout m_layout;
QLabel m_l1, m_l2;
public:
Widget(QWidget * parent = 0) : QWidget(parent), m_layout(this) {
m_layout.addWidget(&m_l1);
m_layout.addWidget(&m_l2);
m_l1.connect(MessageSink::instance(), SIGNAL(message(QString)), SLOT(setText(QString)));
m_l2.connect(MessageSink::instance(), SIGNAL(message(QString)), SLOT(setText(QString)));
}
}
int main(int argc, char ** argv) {
QApplication app(argc, argv);
MessageSink sink(&app);
Widget w;
w.show();
emit sink.message("Hello!");
return app.exec();
}
注意:這是不是一個錯誤,有一個本地QObject
有一個父母。你只需要確保it gets destructed before the parent。 C++在這裏保證。
我們回答大部分都是一樣的.. :) – ABCplus
@ABCplus,偉大的思想! – TheDarkKnight
我們正在爲同一個項目工作嗎? :) – ABCplus