gpt4 book ai didi

c++ - 具有 qml 函数和 c++ 插槽的最佳方法,反之亦然

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:22 25 4
gpt4 key购买 nike

我想做这样的事情

QML app:

{
signal qmlSignal
function qmlFunction
}

c++ Hnadler:

{
c++ slot
c++ signal
}

想要与同一个 qml 对象进行两种方式的通信。我指的是 http://qt-project.org/doc/qt-4.8/qtbinding.html

要从 C++ 更改 qml 中的值,我们可以这样做

  QDeclarativeEngine engine;
QDeclarativeComponent component(&engine, "MyItem.qml");
QObject *object = component.create();

QVariant returnedValue;
QVariant msg = "Hello from C++";
QMetaObject::invokeMethod(object, "myQmlFunction",
Q_RETURN_ARG(QVariant, returnedValue),
Q_ARG(QVariant, msg));

qDebug() << "QML function returned:" << returnedValue.toString();
delete object;

可用于调用qml函数。但是有了这个我们就不能使用QT方法了

class MyClass : public QObject
{
Q_OBJECT
public slots:
void cppSlot(const QString &msg) {
qDebug() << "Called the C++ slot with message:" << msg;
}
};

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

QDeclarativeView view(QUrl::fromLocalFile("MyItem.qml"));
QObject *item = view.rootObject();
MyClass myClass;
QObject::connect(item, SIGNAL(qmlSignal(QString)),
&myClass, SLOT(cppSlot(QString)));

view.show();
return app.exec();
}

这可以用于 qmlsignal 和 c++ slot。有没有一种方法可以在一个对象中完成这两项工作?

最佳答案

=== 更新问题 ===

您可以在 QML 中调用槽或 Q_INVOKABLE 方法来更改 QML 中的“C++ 属性”。不过,您需要将 C++ 对象公开为上下文属性。你需要在下面写这样的东西:

我的类.h

class MyClass : public QObject
{
Q_OBJECT
public:
MyClass(QObject *parent) : QObject(parent) { ... }

Q_INVOKABLE void myInvokable();

public slots:
void mySlot();

...
}

main.cpp

...

MyClass myClassObject;
QQuickView view;
view.rootContext()->setContextProperty("myClassContextProperty", &myClassObject;
view->setSource(QUrl::fromLocalFile("main.qml"));
view->show();

...

主.qml

Button {

...

// You can replace onClicked with your own custom signal

onClicked: myClassContextProperty.myslot()

// or

onClicked: myClassContextProperty.myInvokable()

...
}

===评论里有问题===

您将在 C++ 中拥有一个 Q_PROPERTY,并将该属性绑定(bind)到您在 QML 中的属性,或者捕获名为“foo”的属性的 onFooChanged 信号处理程序。

我的类.h

class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(foo READ foo NOTIFY fooChanged)
public:
MyClass(QObject *parent) : QObject(parent) { ... }

int foo() const;

public signals:
void fooChanged();

public slots:
void mySlot() { foo = 5; emit fooChanged(); };

private:
int foo;

...
}

main.cpp

...

MyClass myClassObject;
QQuickView view;
view.rootContext()->setContextProperty("myClassContextProperty", &myClassObject;
view->setSource(QUrl::fromLocalFile("main.qml"));
view->show();

...

主.qml

...
// Bind foo to bar
property int bar: myClassContextProperty.foo

===原题===

您似乎想问是否可以同时在 C++ 和 QML 中声明相同的内容,即它的某些部分在 QML 中,然后其余部分在 QML 中。

我认为您需要使用 Qt 元类型系统注册(qmlRegisterMetaType 等)您的 C++ 类型,然后您可以将该类用作 QML 中的一个项目(可能与父类一起使用?)以实现您的愿望。

这是进一步阅读的相关文档:

Registering an Instantiable Object Type

为了您的方便,这里有一些内联代码:

消息.h

class Message : public QObject
{
Q_OBJECT
Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
Q_PROPERTY(QDateTime creationDate READ creationDate WRITE setCreationDate NOTIFY creationDateChanged)
public:
// ...
};

qmlRegisterType<Message>("com.mycompany.messaging", 1, 0, "Message");

...

主.qml

import com.mycompany.messaging 1.0

Message {
author: "Amelie"
creationDate: new Date()
}

关于c++ - 具有 qml 函数和 c++ 插槽的最佳方法,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20988224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com