错误 invalid use of non-static data member 'main form zhiliu

在Qt开发中遇到QML无法找到C++中的非静态数据成员'zhiliu_datainfo'的问题。通过将变量改为静态并初始化,解决了编译错误。但在QML中仍无法找到该变量,最终发现是命名不一致导致的。在修正命名后,QML能正确编译,但数据显示问题依旧。通过加入定时器和调试,发现需要将数据成员改为函数返回方式以实现动态显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

               

google翻译:使用无效的非静态数据成员的main_form:: zhiliu_datainfo;难不成只能使用静态的数据?

静态就静态了,这个又不是不可以改的,(以前把静态变量和常量进行了混淆,现在明白了,这就不是个问题了)

果断加上static:

Q_INVOKABLE static u_char zhiliu_datainfo[30]; //直流

再编译一下:

错误:undefined reference to `main_form::zhiliu_datainfo'

出错 了,google一下:未定义的参考`main_form:: zhiliu_datainfo“

哦,它说的没有定义,呵,我在CPP中定义一下,再看,不过初值定为多少呢?就全为零吧!


这样定义:u_char main_form::zhiliu_datainfo[30]={0x00};

file:///root/桌面/kangear/qt/serialport/1.5-3.6(Qt+Qml)/MyItem2.qml:4: ReferenceError: Can't find variable: zhiliu_datainfo

这下编译是通过了,不过Qml又找不到了这个值,我看看我前几天的文章再:《QML调用Qt_CPP中的变量http://blog.youkuaiyun.com/kangear/article/details/8042187


哈哈 终于找到原因了我名字起成“zhiliu”,而我在Qml却写成了zhiliu_datainfo,怪不呢!!!

import QtQuick 1.0Rectangle{    Text{        text:zhiliu_datainfo    }}

这下没有错误了,不过却不见Qml露面……UI都没有出现是因为我没有插串口的事吗?

插上再看!

2012年10月9日20:46:30:还是不行,CPP的程序已经运行,再看看main.cpp中的:

#include <QtGui/QApplication>#include "main_form.h"#include <QDeclarativeView>#include <QDeclarativeContext>int main(int argc, char *argv[]){    QApplication a(argc, argv);    QDeclarativeView view;    main_form w;//    view.rootContext()->setContextProperty("applicationData", &w);    view.rootContext()->setContextProperty("zhiliu",*main_form::zhiliu_datainfo);//    view.rootContext()->setContextProperty("jiaoliu",*main_form::jiaoliu_datainfo);//    view.rootContext()->setContextProperty("dianchi",*main_form::dianchi_datainfo);//    view.rootContext()->setContextProperty("jueyuan",*main_form::jueyuan_datainfo);//    view.rootContext()->setContextProperty("kuixian",*main_form::kuixian_datainfo);//    view.rootContext()->setContextProperty("nibian",*main_form::nibian_datainfo);//    view.rootContext()->setContextProperty("DCtoDC",*main_form::DCtoDC_datainfo);    view.setSource(QUrl::fromLocalFile("../MyItem2.qml"));    view.show();//    w.show();    return a.exec();}

再看看标准的Qml和CPP混合编程main.cpp:

#include <QApplication>#include <QDeclarativeView>#include <QDeclarativeContext>#include "applicationdata.h"int main(int argc, char *argv[]){    QApplication app(argc, argv);    QDeclarativeView view;    ApplicationData data;    view.rootContext()->setContextProperty("applicationData", &data);    view.setSource(QUrl::fromLocalFile("../myDeclarativeContext100/MyItem.qml"));    view.show();    return app.exec();}

改成一样的看看.............

2012年10月9日20:55:05:不行,仍然没有,这程序绝对在戏弄我!!!

2012年10月9日21:01:30:换成全英文目录:结果:不行!

2012年10月9日21:05:28:泪奔!!我QML没设置大小,估计是有了,不过我看不到而已!!!

改为:

import QtQuick 1.0Rectangle{    width: 300    height: 300    Text{        text:zhiliu    }}

下边是运行效果图:


数也正确!OYE!!!!!

不急,杀个回马枪把上边假设的验证一下:

①:中文目录:结论:在LInux下中文目录并不会导致Qt程序运行失败!

②:没了……呵呵  今天收获不少!

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

把单片机接上再来欣赏一下 全流程 的:


糟糕!!!!,明明已经接到数据,QML里边为什么还是“0”,莫非它只是,上电时获取一次!加上timer试试……

2012年10月9日21:23:12:QML改为

import QtQuick 1.0Rectangle{    width: 300    height: 300    Text{        id:text        text:zhiliu    }    Timer{        interval:500;        running: tue;        repeat:true        onTriggered: text.text = zhiliu    }}

结果还是不行!!在cpp中调试一下,看值是不是没有变……

2012年10月9日21:27:13:加上如下调试信息:

qDebug("%u",zhiliu_datainfo[0]);
不过运行结果是这样的:

数组中的值是变了,可是QML中还是0,好痛苦!!!

import QtQuick 1.0Item {    Timer {        interval: 500; running: true; repeat: true        onTriggered: time.text = Qt.formatDateTime(new Date(), "dddd\nyyyy-MM-dd\n-MMM-\nhh-mm-ss")                                                              // 星期 年份 月份 号 大月份    }    Text { id: time }}

上边这么简单的程序都能动态显示时间,我的为什么不能动态显示数据呢???

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

2012年10月9日21:35:44:

静下心来好好想想,暂且不想为什么不行了,还是想想如何得到数据为首要任务!对比了上边的动态显示时间的程序,这个是个函数,而我的是这数组,我按照这各种形式改为函数试试:参考《QML调用Qt_CPP中的变量http://blog.youkuaiyun.com/kangear/article/details/8042187

2012年10月9日21:56:05:

不死心,先看看QML中定时器是否正常运行,把上边显示时间的程序拷进去看看:


时间正常动态显示,说明timer没有问题……

估计我得死心了,我得改为函数返回的方式了……

2012年10月9日22:33:21:

写这样一个回调小函数:

unsigned char main_form::displayData(){    return zhiliu_datainfo[0];}


可以动态了,明天再完善一下……

           
在C++中,"invalid use of non-static data member"(无效使用非静态数据成员)错误通常出现在以下几种情况: 1. **在类定义之外直接访问非静态数据成员**:非静态数据成员属于类的实例,必须通过对象来访问,而不能在类定义之外直接访问。 2. **在静态成员函数中访问非静态数据成员**:静态成员函数不属于任何实例,因此无法直接访问非静态数据成员。 ### 示例代码 ```cpp class MyClass { public: int nonStaticMember; static void staticFunction() { // 错误:无法直接访问非静态数据成员 // nonStaticMember = 10; } void nonStaticFunction() { // 正确:通过对象访问非静态数据成员 nonStaticMember = 10; } }; int main() { MyClass obj; // 正确:通过对象访问非静态数据成员 obj.nonStaticMember = 10; // 错误:在类定义之外直接访问非静态数据成员 // MyClass::nonStaticMember = 10; return 0; } ``` ### 解决方法 1. **通过对象访问非静态数据成员**:确保通过类的实例来访问非静态数据成员。 2. **在非静态成员函数中访问非静态数据成员**:非静态成员函数可以自由访问类的所有非静态数据成员。 ### 修正后的代码 ```cpp class MyClass { public: int nonStaticMember; static void staticFunction() { // 正确:通过对象访问非静态数据成员 MyClass obj; obj.nonStaticMember = 10; } void nonStaticFunction() { // 正确:通过对象访问非静态数据成员 nonStaticMember = 10; } }; int main() { MyClass obj; // 正确:通过对象访问非静态数据成员 obj.nonStaticMember = 10; return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值