首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QtCreator中用于C++类型的自动完成

QtCreator中用于C++类型的自动完成
EN

Stack Overflow用户
提问于 2018-08-06 17:53:05
回答 1查看 962关注 0票数 0

我在C++中定义了要在QML中使用的一些类。在编写代码时,我希望QtCreator自动列出C++对象的所有可用属性和函数。

下面的示例说明了这个问题:在C++中,我定义了一个Office类(带有address属性和一个sendEmail方法)。我还定义了一个公司类(有一个总部属性和一个办公室列表)。最后添加了这两个类的代码。

main.cpp中,我添加了以下行,目的是让QML/javascript知道这些类型。

代码语言:javascript
复制
Company theCompany;
engine.rootContext()->setContextProperty("theCompany", &theCompany);
qmlRegisterType<Office>();

然而,这似乎还不够:在下面的QML代码中,我列出了哪些属性/方法是自动完成的,哪些不是

代码语言:javascript
复制
import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    property var company: theCompany         //auto-completion OK
    property var hq: theCompany.headquarters //auto-completion OK
    property var hqAddress: hq.address       //auto-completion NOT OK
    property var offices: theCompany.offices //auto-completion OK
    property var firstOffice: offices[0]
    property var firstAddress:  firstOffice.address  //auto-completion NOT OK
    function update() {
        hq.sendEMail()                       //auto-completion NOT OK
    }
}

因此,问题是:我能让QML知道Office类型吗?如果是的话,怎么做?这也适用于QList<Office*>吗?

提前谢谢你,

Marc

==================================

office.h

代码语言:javascript
复制
#ifndef OFFICE_H
#define OFFICE_H

#include <QObject>

class Office : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString address MEMBER m_address NOTIFY addressChanged)
public:
    explicit Office(QObject *parent = nullptr);
    Q_INVOKABLE void sendEMail(QString message){};

signals:
    void addressChanged();

public slots:

private:
    QString m_address;
};

#endif // OFFICE_H

office.cpp

代码语言:javascript
复制
#include "office.h"

Office::Office(QObject *parent) : QObject(parent)
{

}

company.h

代码语言:javascript
复制
#ifndef COMPANY_H
#define COMPANY_H

#include <QObject>

#include "office.h"

class Company : public QObject
{
    Q_OBJECT
    Q_PROPERTY(Office* headquarters MEMBER m_headquarters NOTIFY headquartersChanged)
    Q_PROPERTY(QList<Office *> offices MEMBER m_offices NOTIFY officesChanged)
public:
    explicit Company(QObject *parent = nullptr);

signals:
    void officesChanged();
    void headquartersChanged();

public slots:
private:
    QList<Office*> m_offices;
    Office* m_headquarters;
};

#endif // COMPANY_H

company.cpp

代码语言:javascript
复制
#include "company.h"

Company::Company(QObject *parent) : QObject(parent)
{

}

main.cpp

代码语言:javascript
复制
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include "company.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    Company theCompany;
    engine.rootContext()->setContextProperty("theCompany", &theCompany);
    qmlRegisterType<Office*>();
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-07 06:59:29

我看到:

代码语言:javascript
复制
property var company: theCompany         //auto-completion OK
property var hq: theCompany.headquarters //auto-completion OK
property var hqAddress: hq.address       //auto-completion NOT OK
property var offices: theCompany.offices //auto-completion OK
property var firstOffice: offices[0]
property var firstAddress:  firstOffice.address  //auto-completion NOT OK
function update() {
    hq.sendEMail()                       //auto-completion NOT OK
}

在那里我从来没见过

代码语言:javascript
复制
property Office firstOffice

我明白了

代码语言:javascript
复制
property var firstOffice

类型var没有属性address,因此没有代码完成。

该属性仅在运行时存在。

至少对我来说,当Office注册(具有名称)并且类型为Office时,QtCreator将给我正确的代码完成。

hq也是如此--即使是作为QML文件的读者,我也不知道它的类型。为什么QtCreator应该知道这一点?

顺便说一句:与QtCreator类似,JIT也不了解这些属性,所以在方程中有一个类型的var,就不会有任何优化绑定

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51713145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档