使用c ++在Qt中创建自定义属性

时间:2015-05-11 07:34:18

标签: c++ qt

我是Qt的新手并尝试在Qt中创建自定义属性。 为了保持简短,我在这里合并了.h和.cpp文件,但它们在我的主项目中有所不同。 我的main.cpp是

#include<messageBody.h>
class Message : public QObject
{
    Q_OBJECT
    Q_PROPERTY(MessageBody* body READ body WRITE setBody NOTIFY bodyChanged)
    MessageBody ob;
public:
    MessageBody* body()
    {
        return &ob;
    }
    void setBody(MessageBody* body)
    {
         ob.textUpdate(body->text());
         emit bodyChanged();
    }

signals:
    void bodyChanged();
};

我的message.h是

class MessageBody : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE textUpdate NOTIFY textChanged)
    QString ori_text;
public:
    void textUpdate(const QString& new_txt)
    {
        if(new_txt != ori_text)
        {
            ori_text=new_txt;
            emit textChanged();
        }
    }
    QString text()
    {
        return ori_text;
    }

    signals:
        void textChanged();
};

我的messageBody.h是

import QtQuick 2.3
import QtQuick.Controls 1.2

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Text{
        msg.body: "Hello, world!" //"Error here."
                             //I am expecting MessageBody::textUpdate()
                             //to get called i.e write method of Property
    }
}

我的main.qml是

 qrc:/main.qml:18 Cannot assign to non-existent property "msg"

执行时,我收到错误

string s = getInput(this.txtName);

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这是因为您正在使用msg对象,就好像它是QML Text Element的现有属性一样,这不是Qt为什么会给您这个错误。

我不是QML专业开发人员,但据我所知,您可以使用文本对象的现有信号(例如msg.body o onTextChange)致电Component.onCompleted或尝试创建custom QML object继承自Text并且具有自定义属性msg.body,该属性与您的c ++对象的msg.body建立链接。

答案 1 :(得分:2)

我没有100%得到你要达到的目标,但也许是这样的:

main.qml

UISwipeGestureRecognizer* rightSwipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipe:)];

rightSwipeRecognizer.direction = UISwipeGestureRecognizerDirectionRight;

[self.tableView addGestureRecognizer:rightSwipeRecognizer];

的main.cpp

import QtQuick 2.3
import QtQuick.Controls 1.2

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Text{
        text: msg.body.text
    }

    Component.onCompleted: {
        msg.body.text = "Hello, world!"
    }
}

这有用吗?