• 5687阅读
  • 3回复

[提问]新手求助-关于QTreeWidget显示项的问题 [复制链接]

上一主题 下一主题
离线承諾_sweet
 
只看楼主 倒序阅读 楼主  发表于: 2012-04-14
我把从socket传过来的字符数组转换成Qstring然后显示QTreeWidget上,部分代码如下:
QTreeWidgetItem *item = new QTreeWidgetItem;
char name[256];
memset(&name, 0x00, 256);
memcpy(&name, dirlistbuf, 256);              //把从socket传过来的dirlistbuf转给name字符数组
printf("%-30s\t", name);          
s2=QString::fromLocal8Bit(name,sizeof(name));
item->setText(0,s2);
ui->filelist->addTopLevelItem(item);


printf那一步是可以正常显示出name数组的,但是 QTreeWidget无法显示,显示出一串不知道是什么:
离线fish0619

只看该作者 1楼 发表于: 2012-04-14
你这段代码错了很多地方。首先从socket取得数据的时候就应该得到数据块的大小。这个一般是从数据包解析出来,或者`recv()`,`read()`等函数都可以得到数据包的大小。

其次,复制数据的时候错了。应该是`memcpy(name, dirlistbuf, sizeof(name));`你的第一个参数多个一个`&`。`name`本身被声明为一个数组,数组名实际上就是`const char*`指针。真奇怪你这段代码竟然可以跑起来没报内存错误。

C语言的`char *`使用`\x0`结束一个字符串,在`\x0`之后的字符是无意义的字符。所以你在调用`QString::fromLocal8Bit()`时,第二个参数应该传入字符串的实际长度,而不是`sizeof(name)`。你应该用`strnlen()`函数来代码`sizeof(name)`。

你的基础知识应该很不牢靠。如果真的打算学好C++的话,建议拿本《C++ Primer》、《The C++ Programming Language》好好看看。
离线承諾_sweet
只看该作者 2楼 发表于: 2012-04-14
回 1楼(fish0619) 的帖子
谢谢哇  我试试
离线蠢蠢欲懂
只看该作者 3楼 发表于: 2012-05-02
网络编程吧
快速回复
限100 字节
 
上一个 下一个