我的主要目標是在* .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")
}
}
}
的錯誤消息是「元素是不可創建的」,這是一種預期。
我的問題是:
- 是否可以定義一些QML組件時,連接到一個單獨的信號?
- 如果是,那麼正確的語法是什麼?
- 如果沒有,在QML文件中定義UI元素(小部件)時,接收關於核心數據更改事件(在某個單例對象中定義)的通知的正確/可接受的方式是什麼?
沒有
consol
對象只是想補充,使一個別名也不能工作的性質。我也有同樣的問題。 @folibis'的答案也適用於我。 – 2016-03-03 18:36:35