QT C++无法连接到QML
QT C++ to QML can not be connected
我有以下代码:
class Boundaries: public QObject{
Q_OBJECT
enum Type{
in,
out
};
QDateTime m_startTimeBoundary{};
QDateTime m_endTimeBoundary{};
QDateTime m_from{};
QDateTime m_to{};
Q_PROPERTY(QDateTime fromDate READ getFromDate NOTIFY emitSignal1)
Q_PROPERTY(QDateTime toDate READ getToDate NOTIFY emitSignal1)
QDateTime getFromDate(){
return m_from;
}
QDateTime getToDate(){
return m_to;
}
public: signals:
void emitSignal1();
public:
void initBoundaries(const QDateTime& start,const QDateTime& end){
if (m_startTimeBoundary.isNull() && m_endTimeBoundary.isNull()){
m_startTimeBoundary = start;
m_endTimeBoundary = end;
}
}
void myClass(const QDateTime& origin, qint64 diffMs, Type type)
{
//..some code..
emit emitSignal1();
}
Q_INVOKABLE void myClassIn(const QDateTime& origin, qint64 diffMs){
myClass(origin, diffMs, Type::in);
}
Q_INVOKABLE void myClassOut(const QDateTime& origin, qint64 diffMs){
myClass(origin, diffMs, Type::out);
}
};
我的C++模型:
class MyCustomModel: public QObject{
Q_OBJECT
..some code..
Q_PROPERTY(Boundaries* myClass READ getmyClass)
Boundaries* m_myClass;
Boundaries* getmyClass(){
return m_myClass;
}
.. some other code..
}
我的QML连接问题来了:
MyButton {
anchors.verticalCenter: timeFilterRow.verticalCenter
onClicked:{
var x = getDataX()
var y = getDataY()
myCustomModel.myClass.myClassIn(_org, diff)
}
}
但我得到一个错误,说Boundaries
是未知的。你们中有谁能帮助我理解我在这里做错了什么吗?还是我错过了什么?
根据我对myCustomModel.myClass.myClassIn(_org, diff)
的理解,您试图从C++环境中调用对象的函数,但实际上您正在创建一个类型为MyCustomModel
的新实例,该实例需要QML知道类Boundaries
与其注册类型(qmlRegisterType
(使其可实例化,我想您正在寻找一种方法来传递C++对象,使其在QML 中可访问
如果是这种情况,您可以通过声明一个上下文属性来实现这一点:
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
MyCustomModel model;
engine.rootContext()->setContextProperty(QStringLiteral("modelinstance"), &model);
engine.load(QUrl(QStringLiteral("qrc:/main.qml"));
return app.exec();
}
然后,您应该能够从QML:中对此对象实例进行调用
if (modelinstance)
modelinstance.myclass.myClassIn(_org, diff)
您是否在任何时候创建了Boundaries
类型的对象?
在C或C++中声明指针不会自动实例化对象,成员甚至不会默认初始化为nullptr
,因此它可以是内存的任何地址。如果真的是这样的话,你很幸运它没有坠毁。如果在调试模式下在正确的平台上使用了正确的编译器,则指针会自动初始化为nullptr
。
Qml从类型信息(QMetaObject,https://doc.qt.io/qt-5.14/qmetaobject.html)哪些调用程序/插槽/属性可用。如果指针是nullptr
,则Qml无法访问该对象的类型信息,因为它不存在。
下一点:如果你想在Q_PROPERTY
:中使用,你必须在Qt类型系统中注册你的类型
Q_DECLARE_METATYPE(Boundaries)
https://doc.qt.io/qt-5.14/qmetatype.html#Q_DECLARE_METATYPE
Qt正在将属性类型打包到QVariant
中(查看类型擦除模式(。要使用它,你必须告诉Qt,你的类型将需要它的代码(默认情况下,它不会为你定义的所有类生成代码,严格按照"你只为你使用的东西付费"(。
- 如何使用connect将qml按钮与同一类的cpp函数连接起来
- QT - 连接 Qml 按钮 单击到 Cpp 构造函数
- 连接 qml 拨号和 qml 中的滑块
- 可以在 QObject::connect() C++中连接 QML 对象现有信号?
- 销毁 qml 对象后的信号槽连接
- 将QAbstractTableModel与QML TableView连接起来
- QML和C 连接到信号
- 如何使用C 插槽连接QML信号
- QT:C 信号到QML连接
- 连接从 QML 到 Qt 的信号:var 到 QList<QString>
- QML组件与信号连接
- Qt-Qml连接到上下文属性的QObject属性的信号
- 当连接的 QML 属性更改时C++对象不会获取值
- 连接到来自 QML C++信号
- QObject::connect:在 c++ Qt 5.3 中连接 qml 信号时没有这样的信号
- 如何连接来自c++代码的嵌套qml项的信号
- 无法将 QML 组合框信号连接到插槽C++
- 级联导航窗格:连接到另一个qml文件的对象信号
- 动态连接 QML 中图形的节点 la Pd 或 Max(又名"patching"接口)
- 如何在qml上检查网络连接?