• 9403阅读
  • 10回复

QList<T>作为结构参数,出错!!! [复制链接]

上一主题 下一主题
离线wodecision
 
只看楼主 倒序阅读 楼主  发表于: 2011-06-16
    如题,刚接触QT几天,需要用到动态数组,顾以QList来实现,没想到会遇到如下错误提示:
   1。passing 'const QList<TDevSubItem>' as 'this' argument of 'void QList<T>::clear() [with T = TDevSubItem]' discards qualifiers
    2。passing 'const QList<TDevSubItem>' as 'this' argument of 'void QList<T>::push_back(const T&) [with T = TDevSubItem]' discards qualifiers
    结构声明如下:
typedef struct{    
  QString pCode;    
  QString pName;    
  QString pUnit;
}TDevSubItemPara;
typedef struct{    
  QString dCode;    
  QString name;  
   QString icon;    
  QList<TDevSubItemPara> Para;
}TDevSubItem;
typedef struct{    
  QString dType;    
  QString name;    
  QString icon;  
   QList<TDevSubItem> SubItem;
}TDevList;
Typedef QList<TDevList> DevList;


    实现向QList里存数据:    
    DevList sysDev;
    void DBModule::InitDevList(void)
{    
QString tSQL = "";    
QSqlQuery QueryResult;    
TDevList dl;    
TDevSubItem dsi;    
//查询设备列表    
QueryResult.clear();  
tSQL = "select * from dev_type";    
QueryResult = dbModule.Query(tSQL);    
if(QueryResult.isValid())    
{        
sysDev.clear();        
do        {            
dl.dType = QueryResult.value(0).toString();            
dl.name = QueryResult.value(1).toString();            
dl.icon = QueryResult.value(2).toString();            
sysDev.push_back(dl);        
}while(QueryResult.next());      
//测试输出...        
#if(DEBUT_FLAGS)            
QString name = sysDev.at(0).name;            
QString type = sysDev.at(0).dType;            
qDebug() << name << type;  //把值输出到调试窗口.        
#endif    
}    
//查询某设备的子项    
for(int i=0;i<sysDev.size();i++)  
{        
QueryResult.clear();      
tSQL = "select dev_id,dev_name,dev_type_ico from dev_list where dev_type_id = '";      
tSQL = tSQL + sysDev.at(i).dType + "' order by dev_id";        
QueryResult = dbModule.Query(tSQL);        
if(QueryResult.isValid())        
{            
sysDev.at(i).SubItem.clear();    //错误:1            
do            {                
dsi.dCode = QueryResult.value(0).toString();              
dsi.name = QueryResult.value(1).toString();                
dsi.icon = QueryResult.value(2).toString();                
sysDev.at(i).SubItem.push_back(dsi);    //错误:2                    
}while(QueryResult.next());            
//测试输出...            
#if(DEBUT_FLAGS)                
QString type = sysDev.at(i).SubItem.at(0).dCode;                
QString name = sysDev.at(i).SubItem.at(0).name;                
qDebug() << name << type;  //把值输出到调试窗口.            
#endif        
}  
}
}


小菜很急,忘高手支招!!! 拜谢!
离线jdwx

只看该作者 1楼 发表于: 2011-06-16
QList    const T &    at ( int i ) const
at返回值不可以修改。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线jdwx

只看该作者 2楼 发表于: 2011-06-16
回 楼主(wodecision) 的帖子
像STL容器应该用迭代器访问,QList的at是为了使用方便增加的,数据少的时候速度还可以,数据多了速度非常慢。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线wodecision
只看该作者 3楼 发表于: 2011-06-16
jdwx,能举个例子吗?
离线diyuanbo

只看该作者 4楼 发表于: 2011-06-19
sysDev.at(i).SubItem.clear();改成sysDev.SubItem.clear();
sysDev.at(i).SubItem.push_back(dsi);    改成sysDev.SubItem.push_back(dsi);  
试试
离线wodecision
只看该作者 5楼 发表于: 2011-06-20
sysDev.XXXX下,无SubItem成员。谢谢回复!!!
离线jdwx

只看该作者 6楼 发表于: 2011-06-20
回 楼主(wodecision) 的帖子
写了个例子
附件: list.rar (3 K) 下载次数:5
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线zhy282289
只看该作者 7楼 发表于: 2011-06-24
at()取的数不能修改(且不会发生拷贝,数据共享要了解看相关资料)
你应该用:
sysDev.SubItem.clear();改成sysDev.SubItem.clear();
sysDev.SubItem.push_back(dsi);    改成sysDev.SubItem.push_back(dsi);  
为什么我脸这么胖~
离线zhy282289
只看该作者 8楼 发表于: 2011-06-24
sysDev.SubItem.clear();
sysDev.SubItem.push_back(dsi);  
吗的
为什么我脸这么胖~
离线zhy282289
只看该作者 9楼 发表于: 2011-06-24
这........回复有问题啊..真磋
sysDev
后面的回复的时候没有了...囧
为什么我脸这么胖~
离线zhy282289
只看该作者 10楼 发表于: 2011-06-24
我就不信了...去掉#就好了,看到不
sysDev#[#i#].SubItem.clear();
真累..


为什么我脸这么胖~
快速回复
限100 字节
 
上一个 下一个