如何使用带有QML信号的自定义Qt类型?
问题描述:
我创建了一个自定义类型我的Qt 5.2 QML应用如何使用带有QML信号的自定义Qt类型?
class Setting : public QObject
{
Q_OBJECT
Q_PROPERTY(QString key READ key WRITE setKey)
Q_PROPERTY(QVariant value READ value WRITE setValue)
public:
Setting(QObject * parent = 0);
QString key() const;
void setKey(QString const & key);
QVariant value() const;
void setValue(QVariant const & value);
private:
QString m_key;
QVariant m_value;
};
内,在我的主要函数注册它:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
qmlRegisterType<Setting>("Setting", 1,0, "Setting");
// ...
}
在我的应用我想有,有一个按钮信号与我的自定义类型作为参数:
import Setting 1.0
Button
{
signal settingChanged(string, Setting)
// ...
}
每当我按下按钮信号应该发射。
如果我尝试我的QML信号有我的C++插槽连接
QObject::connect(myButton, SIGNAL(settingChanged(QString, Setting)), this, SLOT(settingChanged(QString, Setting)));
的Qt说
QObject::connect: No such signal Button_QMLTYPE_41_QML_45::settingChanged(QString, Setting) in ...
如果我从信号定义中删除我的自定义类型
Button
{
signal settingChanged(string)
// ...
}
和修改连接呼叫
QObject::connect(myButton, SIGNAL(settingChanged(QString)), this, SLOT(settingChanged(QString)));
连接呼叫工作。
我可以使用我的自定义qml类型在我的应用程序的qml部分内设置。但我做错了,如果我想用我的信号settingChanged?
谢谢!
答
我非常仔细地readed Qt文档之后,我发现这里的答案
文档说
当QML对象类型被用作信号参数,参数 应该使用var作为类型,并且该值应该在C++中接收 使用QVariant类型。
所以,Setting
的QML描述内的信号定义必须与var
代替。
import Setting 1.0
Button
{
signal settingChanged(string, var)
// ...
}
为了与C++时隙连接QML信号,代码必须是
Object::connect(myButton, SIGNAL(settingChanged(QString, QVariant)), this, SLOT(settingChanged(QString, QVariant)));
在这点的连接工作!
为了使整个事情运行,QVariant
必须被投入到插槽内的正确类型。在我的情况下,一个Setting
类型。
void Foo::settingChanged(QString name, QVariant const & var)
{
Setting * setting = qobject_cast<Setting*>(var.value<QObject*>());
// ...
}
您是否在类声明的末尾放置了'Q_DECLARE_METATYPE(Setting)'宏? – Nejat 2014-09-04 04:01:24
@Nejat我没有定义这个宏。但是当我在我的类声明结尾处放置Q_DECLARE_METATYPE(Setting)时,结果与我的问题中所述的相同。所以,没有任何改变。 – Franz 2014-09-04 16:34:08