2014-10-11 29 views
4

我的主要目標是在* .qml文件中定義QML組件的同時接收來自單例對象的信號。如何將來自C++代碼中定義的單例對象的信號連接到QML組件?

比方說,我在C中定義一個單獨的對象++代碼:

class MySingleton : public QObject 
{ 
    Q_OBJECT 

    Q_PROPERTY(QString value READ value WRITE setValue NOTIFY valueChanged) 

    typedef QObject Base; 
public: 

    static MySingleton* instance(); 

    const QString& value() const; 
    void setValue(const QString& value); 

signals: 
    void valueChanged(); 

private: 
    MySingleton(QObject* parent = nullptr); 
    QString m_value; 
}; 

在MySingleton.cpp:

MySingleton* MySingleton::instance() 
{ 
    static MySingleton* obj = new MySingleton(); 
    return obj; 
} 

const QString& MySingleton::value() const 
{ 
    return m_value; 
} 

void MySingleton::setValue(const QString& value) 
{ 
    if (value != m_value) { 
     m_value = value; 
     emit valueChanged(); 
    } 
} 

MySingleton::MySingleton(QObject* parent) 
    : Base(parent), 
    m_value("SomeInitialValue") 
{ 
} 

的單成功地與QML引擎註冊:

QObject *getMySingleton(QQmlEngine *engine, QJSEngine *scriptEngine) 
{ 
    Q_UNUSED(engine) 
    Q_UNUSED(scriptEngine) 

    return MySingleton::instance(); 
} 

void qmlRegisterMySingleton() 
{ 
    qmlRegisterSingletonType<MySingleton>("MySingleton", 1, 0, "MySingleton", &getMySingleton); 
} 

int main(int argc, const char** argv) 
{ 
    ... 
    qmlRegisterMySingleton(); 
    ... 
} 

現在,我嘗試使用來自單身人士的信號。在某處「.qml」文件:

import QtQuick 2.1 
import MySingleton 1.0 

Rectangle { 
    id: someRectangle 
    property string singletonValue : MySingleton.value 

    MySingleton.onValueChanged: { 
     consol.log("Value changed") 
    } 
} 

使用這個語法,我收到‘不存在的連接對象’錯誤包含行‘MySingleton.onValueChanged:’。請注意,分配給「singletonValue」屬性已成功。

我也試着語法更改爲以下:

import QtQuick 2.1 
import MySingleton 1.0 

Rectangle { 
    id: someRectangle 
    property string singletonValue : MySingleton.value 

    MySingleton { 
     onValueChanged: { 
      consol.log("Value changed") 
     } 
    } 
} 

的錯誤消息是「元素是不可創建的」,這是一種預期。

我的問題是:

  1. 是否可以定義一些QML組件時,連接到一個單獨的信號?
  2. 如果是,那麼正確的語法是什麼?
  3. 如果沒有,在QML文件中定義UI元素(小部件)時,接收關於核心數據更改事件(在某個單例對象中定義)的通知的正確/可接受的方式是什麼?
+0

沒有consol對象只是想補充,使一個別名也不能工作的性質。我也有同樣的問題。 @folibis'的答案也適用於我。 – 2016-03-03 18:36:35

回答

7

試試這個:

Connections { 
    target: MySingleton 
    onValueChanged: { 
     console.log("Value changed") 
    } 
} 

而且

  • 我猜你有單身對象的缺失問題。
  • 您在onValueChanged:有錯字 - 存在QML
+0

我正在運行這個問題和答案中的所有代碼,但我得到系統崩潰:QQmlEngine:非法嘗試連接到與QML引擎QQmlApplicationEngine(0xa0c5549c)不同的線程中的MySingleton(0xb406b9c8)。任何想法,爲什麼我得到這個?使用5.7.0。 – Phat 2016-07-11 21:38:15

相關問題