cpp使用qml函数
qml:
Control.Label
{
objectName: 'cpp'
text:"hello"
font.pointSize: 18
function getText(info)
{
return text+info;
}
}
cpp:
auto root = engine.rootObjects();
auto laqml = root.first()->findChild<QObject*>("cpp");
QVariant ret;
QMetaObject::invokeMethod(laqml,"getText",Q_RETURN_ARG(QVariant,ret),Q_ARG(QVariant,"ni da ge"));
qDebug()<<ret.toString()
#qml使用cpp函数
qml
Control.Button
{
text: "qing"
onClicked:
{
Person.printPerson()
}
}
cpp:
//qml调用cpp函数
Person person1("zhou",5);
auto context = engine.rootContext();
context->setContextProperty("Person",&person1);
qml使用的函数前面要加上Q_INVOKABLE
Q_INVOKABLE void printPerson();
qml接受Cpp信号
qml
//qt版本5.12.12无法响应,6.2可以响应,函数名一定是on后面接大写:例如:cpp 信号为 qmlCall qml接收函数为onQmlCall
Connections
{
target: Person
function onQmlCall(){
console.log("call back");
}
}
Cpp 的类型注册到qml
第一种方式注入
注册方法:
//这个模板函数在QML系统中用名称qmlName注册c++类型,在从uri导入的库中使用由versionMajor和versionMinor组成的版本号
qmlRegisterType<Info>("LiuInfo",1,0,"Info");
Cpp
class Info :public QObject
{
Q_OBJECT
Q_PROPERTY(QString m_name READ getName WRITE setName NOTIFY sigNameChanged)
Q_PROPERTY(int m_age READ getAge WRITE setAge NOTIFY sigAgeChanged)
Q_PROPERTY(QDate m_date READ getDate WRITE setDate NOTIFY sigDateChanged)
public:
using QObject::QObject;
void setName(QString name);
QString getName();
void setAge(int age);
int getAge();
void setDate(QDate date);
QDate getDate();
signals:
void sigNameChanged();
void sigAgeChanged();
void sigDateChanged();
private:
QString m_name;
int m_age;
QDate m_date;
};
qml
import LiuInfo 1.0
Info
{
id:info
m_name:"hello"
m_age:18
m_date:Qt.formatDate(new Date(),"yyyy-MM-dd")
function printInfo()
{
console.log(m_name+"age:"+m_age+m_date);
}
}
};
第二种方式注入
QML_ELEMENT
Qt对其解释为:声明外围类型或名称空间在QML中可用,使用其类或名称空间名称作为QML元素名称,
您可以使用构建系统在类型命名空间com.mycompany.qmlcomponents(主版本1)中注册该类型。对于qmake,在项目文件中指定以下内容:
CONFIG += qmltypes
QML_IMPORT_NAME = com.mycompany.qmlcomponents
QML_IMPORT_MAJOR_VERSION = 1
代码具体如下:
class Info :public QObject
{
Q_OBJECT
Q_PROPERTY(QString m_name READ getName WRITE setName NOTIFY sigNameChanged)
Q_PROPERTY(int m_age READ getAge WRITE setAge NOTIFY sigAgeChanged)
Q_PROPERTY(QDate m_date READ getDate WRITE setDate NOTIFY sigDateChanged)
QML_ELEMENT
class Info :public QObject
{
Q_OBJECT
Q_PROPERTY(QString m_name READ getName WRITE setName NOTIFY sigNameChanged)
Q_PROPERTY(int m_age READ getAge WRITE setAge NOTIFY sigAgeChanged)
Q_PROPERTY(QDate m_date READ getDate WRITE setDate NOTIFY sigDateChanged)
QML_ELEMENT
.pro文件中添加
CONFIG += qmltypes
QML_IMPORT_NAME = LiuInfo
QML_IMPORT_MAJOR_VERSION = 1
第三种方式
作为附加属性到别的类中
class Person : public QObject
{
Q_OBJECT
public:
Person(QString name,int age);
Q_INVOKABLE void printPerson() noexcept;
QML_ATTACHED(Info)
QML_ELEMENT
//必须实现此函数,不然会报error: 'qmlAttachedProperties' is not a member of 'Person'
static Info *qmlAttachedProperties(QObject *);
signals:
void qmlCall() const;
public slots:
void slotPrintSignal();
void slotCountClickTen(int count);
private:
QString m_pname;
int m_page;
};
第四种方式:
//这个模板函数在QML系统中用名称qmlName注册c++类型,在从uri导入的库中使用由versionMajor和versionMinor组成的版本号。虽然类型有名称和类型,但无法创建它,如果尝试创建,将会产生给定的错误消息。
当类型仅用于提供附加属性或枚举值时,这很有用
qmlRegisterUncreatableType<Person>("LiuPerson",1,0,"Person","bad");
当你要创建实例时:
出现错误:qrc:/main.qml:18:9: bad
其中bad就是我们自己定义的字符串
Person
{
}