如何从qt c ++类创建qml对象

时间:2017-06-13 23:43:34

标签: qt qml

有一段时间我以为我无法在Qml应用程序中使用Qt c ++类,但我发现了这个:http://doc.qt.io/qt-5/qtqml-cppintegration-definetypes.html

现在我正在尝试创建一个可实例化的对象类型。我第一次遇到“Qwidget:无法创建没有QApplication的Qwidget”在线阅读它答案似乎只是将QGuiApplication更改为QApplication,但后来我得到:“ASSERT:” !D-> isWidget“

这是我尝试用作qml类型的Qt类:http://doc.qt.io/qt-5/qlcdnumber.html

这是我的main.cpp:

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QLCDNumber>
#include <QQuickStyle>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    qmlRegisterType<QLCDNumber>("LCDNumber",1,0,"LCDNumber");
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;


    return app.exec();
}

以下是我在main.qml中创建的内容:

...
import LCDNumber 1.0
Window {

    ... 

    LCDNumber{
        digitCount: 3
        intValue: 1
        mode: LCDNumber.Dec
        segmentStyle: LCDNumber.Flat
        smallDecimalPoint: false
        value: 0
    }
}

是否真的可以在qml中创建qt c ++类?我错过了什么?

1 个答案:

答案 0 :(得分:2)

是的,这是可能的!

在你的类中使用标签Q_PROPERTY和Q_INVOKABLE来提供对属性和方法类的QML访问,如下所示:

 <td><a href='agencies_admin_update.php?id=<?php echo $row['id']; ?>'>UPDATE</a></td>

你的main.cpp:

class NameYourClass : public QDeclarativeItem {
    Q_OBJECT
    Q_PROPERTY(int intProperty1 READ getIntProperty1 WRITE setIntProperty1)
    Q_PROPERTY(QString strProperty2 READ getStrProperty2 WRITE setStrProperty2)

private:
    int intProperty1;
    QString strProperty2;

public:
    explicit NameYourClass(QDeclarativeItem *parent = 0);
    ~NameYourClass();

    Q_INVOKABLE int getIntProperty1() const;
    Q_INVOKABLE void setIntProperty1(int value);

    Q_INVOKABLE QString getStrProperty2() const;
    Q_INVOKABLE void setStrProperty2(const QString &value);
}

您的QML文件:

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    qmlRegisterType<NameYourClass>("IdentifierName", 1, 0, "NameYourClass");

    return app.exec();
}

我认为我没有忘记任何事情。

我希望它有所帮助!