GTK怎样根据值找到列表控件中指定的一行?

雷格 2012-12-20 10:51:36
GtkListStore可以插入一行一行的数据,可是我现在想根据一行的第一列数据的值找到这一行数据。找到它的指针。

比如有一下一个列表
名字 分数
chao 60
xiaom 100
defei 90
我知道了xiaom这个名字想在列表中找它的分数,怎样获得指向xiaom 100的iter才能读取它的分数值。
我知道了xiaom这个名字,我想把它从列表中删除怎么做呢?
...全文
194 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯疯癫癫 2012-12-22
  • 打赏
  • 举报
回复
既然需求是这样,那只能遍历对比值,然后更改了
雷格 2012-12-22
  • 打赏
  • 举报
回复
引用 5 楼 fengfengdiandia 的回复:
我是用鼠标选择的,如果你要遍历当然不是不可以
好吧!只能这样了,我这边需求不一样,是根据从套接字读到的值改变列表项
疯疯癫癫 2012-12-22
  • 打赏
  • 举报
回复
我是用鼠标选择的,如果你要遍历当然不是不可以
雷格 2012-12-21
  • 打赏
  • 举报
回复
引用 3 楼 fengfengdiandia 的回复:
并非是遍历,下面两个GTK的函数,第一个删除一行,第二个删除全部 C/C++ code?12345/* Removes the given row from the list store. After being removed, iter is set to be the next valid row, or invalidated if it pointed to ……
你用gboolean gtk_list_store_remove(GtkListStore *list_store, GtkTreeIter *iter);的时候必须得知道iter啊,你怎么根据一个key去删掉一行呢?还不得遍历比较一下,如果它是我要删除的我就删除它。 我说的是根据值去删除指定的一行。
疯疯癫癫 2012-12-21
  • 打赏
  • 举报
回复
并非是遍历,下面两个GTK的函数,第一个删除一行,第二个删除全部
/* Removes the given row from the list store. After being removed, iter is set to be the next valid row, or invalidated if it pointed to the last row in list_store */
gboolean gtk_list_store_remove(GtkListStore *list_store, GtkTreeIter *iter);

/* Removes all rows from the list store */
void gtk_list_store_clear(GtkListStore *list_store);
雷格 2012-12-21
  • 打赏
  • 举报
回复
引用 1 楼 fengfengdiandia 的回复:
C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738/* 把名字和分数组合成结构体,方便你用指针操作 */typedef struct{ gchar *name; gint score;}Student; gint i = 0;GtkListStore ……
多谢回复, 你说的删除是用遍历实现的吗?
疯疯癫癫 2012-12-20
  • 打赏
  • 举报
回复
/* 把名字和分数组合成结构体,方便你用指针操作 */
typedef struct
{
	gchar *name;
	gint   score;
}
Student;

gint i = 0;
GtkListStore *model;
GtkTreeIter iter;

array = g_array_sized_new (FALSE, FALSE, sizeof (Student), 1);

/* create list store */
model = gtk_list_store_new (NUM_ITEM_COLUMNS, G_TYPE_INT, G_TYPE_STRING,
                              G_TYPE_INT, G_TYPE_BOOLEAN);

/* 想通过名字获取分数的话,你需要得到array和i,当然,你已经知道名字了 */
for (i = 0; i < array->len; i++)
{
	gtk_list_store_append (model, &iter);
	/* 这里是设置,获取的原理是一样的 */
	gtk_list_store_set (model, &iter,
					  g_array_index (array, Student, i).name,
					  g_array_index (array, Student, i).score,
					  -1);
}

/* 
* 关于删除也一样,需要知道iter,GTK只有两种删除,
* 一个是删除全部,另一个是删除一行
*/

/* iter要和tree配合,我这里没写 */
if (gtk_tree_selection_get_selected (selection, NULL, &iter)){
	gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
}
临时写的,不全之处,楼主自行补齐
Xamrin Android开发实战-大学霸 基础篇上 的源代码 第1章  构建开发环境 1 1.1  Xamarin介绍 1 1.1.1  Xamarin发展 1 1.1.2  Xamarin工具 1 1.1.3  Xamarin特点 2 1.2  Xamarin.Forms介绍 2 1.3  开发Xamarin.Forms应用程序需要的工具 3 1.3.1  iOS应用程序 3 1.3.2  Android应用程序 3 1.3.3  Windows Phone应用程序 4 1.4  下载安装Xcode 4 1.4.1 申请苹果账号 4 1.4.2 Xcode的下载安装 8 1.5  下载安装Xamarin.iOS 10 1.5.1  下载OS X版的Xamarin安装包 10 1.5.2  下载安装Xamarin.iOS 11 1.6  下载安装Visual Studio 2015 14 1.6.1  下载Visual Studio 2015 15 1.6.2  安装Visual Studio 2015 17 1.7  下载安装JDK 18 1.7.1  下载JDK 18 1.7.2  安装JDK 20 1.8  Android SDK工具下载安装 26 1.8.1  下载Android SDK 26 1.8.2  下载安装SDK包 29 1.8.3  下载安装Android NDK 32 1.8.4  新建Android模拟器 33 1.9  下载安装Windows版的Xamarin开发工具 37 1.9.1  下载安装GTK# 37 1.9.2  下载安装Xamarin.VisualStudio 38 第2章  编写第一个Xamarin.Forms应用程序 42 2.1  首次启动Visual Studio 2015 42 2.2  更新Xamarin 44 2.2.1  更新Windows版的Xamarin开发工具 44 2.2.2  更新OS X版的Xamarin开发工具Xamarin.iOS 45 2.3  创建项目 47 2.4  项目设置 48 2.4.1  启动开发人员模式 48 2.4.2  登录Xamarin账号 51 2.4.3  连接Mac机或者Mac虚拟机 54 2.5  文件介绍 62 2.6  运行程序 63 2.6.1  运行Android程序 63 2.6.2  运行iOS程序 63 2.6.3  运行Windows Phone程序 65 2.7  编写代码 67 2.8  常见问题 70 2.8.1  指定Android SDK位置 70 2.8.2  快速运行Android模拟器 72 2.8.3  Windows Phone模拟器不可用 73 2.9  使用XAML构建界面 78 2.9.1  XAML介绍 78 2.9.2  创建XAML页面 78 2.9.3  生成文件介绍 79 2.9.4  构建界面 79 第3章  通用界面元素 81 3.1  显示图像 81 3.1.1  显示网络图像 81 3.1.2  显示本地图像 83 3.1.3  定制显示的图像 88 3.1.4  显示彩色的矩形块 93 3.2  显示、编辑文本 95 3.2.1  显示文本控件——标签控件 95 3.2.2  输入文本控件——文本框控件 97 3.2.3  输入文本控件——文本视图 102 3.3  键盘 107 3.3.1  指定键盘类型 107 3.3.2  指定额外的键盘选项 108 3.4  用户交互 111 3.4.1  按钮控件 111 3.4.2  开关控件 116 3.4.3  滑块控件 119 3.4.4  步进控件 122 3.5  进度条、指示器 125 3.5.1  进度条 125 3.5.2  指示器 127 3.6  OpenGL视图 128 3.7  提醒处理 133 3.7.1  警告视图 133 3.7.2  操作表 138 3.8  自定义界面元素 140 3.8.1  通过子类自定义控件 140 3.8.2  通过自定义渲染器自定义控件 142 第4章  表 148 4.1  表视图 148 4.1.1  表视图的使用情况 148 4.1.2  表视图的结构 148 4.1.3  表视图的内容填充 148 4.2  列表视图的填充 154 4.2.1  普通列表视图的内容填充 154 4.2.2  分组列表视图的内容填充 165 4.3  定制列表视图的外观 172 4.3.1  行高 172 4.3.2  页眉页脚 173 4.3.3  分隔线 177 4.4  操作表 179 4.4.1  选择行 179 4.4.2  下拉刷新 182 4.4.3  添加行 185 4.4.4  删除行 188 第5章  布局 191 5.1  内容视图 191 5.2  框架 192 5.3  滚动视图 194 5.4  堆栈布局 195 5.4.1  垂直布局 196 5.4.2  水平布局 197 5.5  相对布局 199 5.5.1  相对于父容器的布局 199 5.5.2  相对于控件的布局 201 5.6  绝对布局 204 5.7  网格 208 第6章  页面 212 6.1  内容页面ContentPage 212 6.2  导航页面NavigationPage 214 6.3  主从页面MasterDetailPage 218 6.4  标签页面TabbedPage 224 6.5  滑动页面CarouselPage 228
软件简介   飞鸽传书(IP Messenger),是由日本人Shirouzu Hiroaki (白水 启章)所发明的免费软件, 是一款局域网内即时通信软件,基于 TCP/IP(UDP)。可运行于多种操作平台(Win/Mac/UNIX/Java),并实现跨平台信息交流。不需要服务器支持, 支持文件/文件夹的传送 (2.00版以上),通讯数据采用 RSA/Blofish 加密 (2.00版以上),十分小巧,简单易用,而且你可以完全免费使用它。目前已有的版本包括: Win32, Win16, MacOS, MacOSX, X11, GTK, GNOME,Java 等, 并且公开源代码. 系统要求   Microsoft Windows 95/98/Me/NT4.0/2000/XP/2003   95/98/NT4.0 ... 要求 comctl32.dll(公共控件) 的版本为 5.x 或更高.   (如果你安装的 IE 是 5.x 或更高版本, 那么就不必担心这个问题了)   注意: Windows 3.1(和 NT3.5x), 请使用 IP Messenger for Win16. 使用说明   < 安装/卸载 >   执行 setup.exe 你可以将 IPMsg 安装到指定目录, 或者重新注册到启动组.   如果需要删除 IPMsg, 请先从控制面板卸载, 再手动删除 IPMsg 目录.   < 系统托盘区图标 >   左键双击图标, 即可打开发送消息窗口.   右键点击图标, 可进入 [服务设置], [离开] 等.   < 发送消息窗口 >   - 发送消息时, 若勾选了 [封装], 则接收者要先打开信封才能看到消息,   如果你还勾选了 [上锁], 则接收者在打开信封时还需要输入密码.   (密码是由接收者自己在 [服务设置] 设置的)   - 若要发送文件/文件夹, 可直接将文件/文件夹拖入发送消息窗口   或在发送消息窗口上点击右键, 再选择发送文件或发送文件夹   - 传送文件/文件夹时, 当接收者还没有保存(下载)文件/文件夹时,   若发送者关闭或重启了 IPMsg, 则附带的文件信息将被清除,   接收者将不能继续接收(下载)到此文件.   - 用户列表前缀符号说明   ":" 表示用户处于离开模式.   "|" 表示用户使用的不是 2.0 以上版本的 IPMsg,   将不支持文件/文件夹的传送, 并且不支持通信数据加密.   "|"(短线) 表示只支持文件/文件夹的传送.   - 拖动列表表头标题项可改变其顺序, 并可点击右键选择"保存列表顺序"   - 在消息输入窗口, 可使用 Ctrl+Tab 输入制表符 Tab.   - 在发送消息窗口上点击右键, 可以进入设置显示优先级, 选择工作组,   搜索用户(Ctrl+F), 传送文件, 传送文件夹, 保存列表顺序, 字体设置,   窗口大小设置, 固定窗口位置, 列表显示设置.   - 在用户名上点击右键, 可设置其显示优先级   优先级按由小到大的顺序排序   - 通过设置显示优先级, 可将经常联系的用户至于列表顶端,   或者隐藏不需要联系的用户   < 接收消息窗口 >   - 在接收消息窗口上点击右键, 可以进入字体设置,   窗口大小设置, 固定窗口位置.   - 接收消息窗口标题栏的 "+" 或 "-" 表示通信数据使用了加密算法   "+" 表示 RSA/1024 位, blowfish/128 位加密   "-" 表示 RSA/512 位, RC2/40 位加密   - 如果你收到的消息附带了文件, 将会显示出附件按钮.   点击按钮即可保存文件.   < 其他 >   - 如果需要(通过路由器)连接到广域网, 则需要设置广播地址.   详见广域网设置(广播设置)   - 其它功能都很容易理解, 你试一试就明白了 操作技巧   1、隐藏/显示窗口Ctrl+D   2、按住Ctrl键再点[刷新]可保持现有用户,搜索新上线的用户   3、打开发送/接收消息窗口Ctrl+Alt+S/R(需要进行详细设置)   4、打开搜索窗口Ctrl+F   5、接收到多个文件,保存时可勾选[全部] 软件原理   局域网聊天软件飞鸽传书是目前比较流行的局域网即时通讯软件,由于历史悠久,它具有比较多的用户。 因为 FreeEIM 的实现原理和飞鸽传书差不多,希望广大用户了解其原理后,在使用时更加得心应手。   开发多年的飞鸽,在他的基础上增加了些许功能,例如语音对话,这里继续讨论FreeEIM(飞鸽传书),前几天,详细的了解了FreeEIM(飞鸽传书)的网络协议,详细分析并且实现了FreeEIM(飞鸽传书)的消息传递过程,这里就FreeEIM(飞鸽传书)的文件和文件夹的传输做详细的说明。   在FreeEIM(飞鸽传书),如果要进行文件或者文件夹的传输,首先需要做的就是消息的应答,通过UDP发送文件传输报文,另外的FreeEIM(飞鸽传书)客户端收到报文后,使用TCP协议发送应答报文,这样就开始进行文件的传输了。   这里开启两个线程,线程1负责文件的传送,线程2负责文件的接受,下边做一一说明。   首先,我们知道,可以发送多个文件,这些文件需要建立链表保存信息。   typedef struct file_info   {   struct file_info *next; //双向链表   struct file_info *forward;   char *file; //文件名   int type; //文件类型:文件或者文件夹   int size; //文件大小   struct sockaddr_in addr; //目标网络信息   } FILE_INFO;   [1]文件传送链表由专门的线程维护,这样,线程1就可以专心进行处理文件传输队列就可以了,线程1始终查询这个链表,如果表头为NULL,就说明没有要传输的文件,表头非空,就开始发送报文,获得正确的应答后,就可以开始文件的传输了,文件传输结束,将相应的链表节点删除。这里借鉴了很多程序使用非常广泛的“命名池”相关的概念,只不过这里我们使用的是“文件池”,可以这么认为,如果有文件要传输,可以不用考虑是否有文件正在传输,只要把要传输的文件放入 “文件池”就可以了 , 同时,不用考虑“文件池”的大小,线程1是文件池的服务线程,它检测文件池的大小,如果非空,就会逐次传输文件。   这里需要特别注意的就是关于文件夹的传输,这个FreeEIM(飞鸽传书)一个难点,应为对与文件夹的内容是没有显示的,需要我们逐次的判断,在飞鸽传书是这么处理的,如果是一个文件夹,就发送文件属性为IPMSG_FILE_DIR的信息包,FreeEIM(飞鸽传书)客户端收到这个信息包后,就创建这个文件夹,然后发起发送的FreeEIM(飞鸽传书)客户端,进入文件夹,传送文件夹内的文件,如果该文件夹下,还有文件夹,使用相同的方法,在文件夹内的文件传送结束后,就发送FREEEIM_FILE_RETPARENT信息包,接受的FREEEI_FILE_RETP报文的FreeEIM(飞鸽传书)客户端,执行返回上一级目录,FreeEIM(飞鸽传书)发送端,就需发送目录下的文件。这样循环操作,最终完成文件的传输,这个过程比较难以理解。   有了上边的知识,开发文件传输功能就变得简单多了,文件的接受也可以类推了,同样开启一个线程维护接受文件链表,逐次接受身下的文件,链表为空时。文件传输会遇到文件读写问题,有的文件发送是被打开了,这样会造成访问违规,所以要有相应的处理,才能让程序更加稳健。   程序启动时先读取用户配置文件,一般是"*.ini"格式,然后,使用Winsock的广播消息给整个局域网发送一个数据包,这时候,如果其他电脑已经运行了飞鸽传书,那么他收到这个包后,会将包的信息读取出来,当然,这个包里有用户的IP,用户名,性别等等。这样,在用户列表里就多了一个用户了。他的用户检查方式就如此简单而已。至于跨网段的实现,只需简单地修改一下广播地址就行了,如果不考虑速度,你可以给整个internet发广播消息。 消息发送,文件传输这些功能,都比较简单,如果你会网络编程,给你对方IP地址,这些功能实现起来再简单不过了。语音、视屏等,只需编写一些语音视频采集代码,传书的话,就像传文件一样。这里给段广播消息的实现代码吧:   // 发送广播登陆消息   void EM_UserLogin::SendLogin_BC(LPEM_DATA msg)   {   SOCKET m_socket;   m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);   if (INVALID_SOCKET == m_socket)   {   MessageBox(0, "socket failed.", NULL, MB_OK);   }   SOCKADDR_IN sin;sin.sin_addr.s_addr = htonl(INADDR_BROADCAST);   sin.sin_family = AF_INET;   sin.sin_port = htons(BROADCAST_SEND_PORT);BOOL bOpt = TRUE;   if (SOCKET_ERROR == setsockopt(m_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)))   {   // Error occurred   ::MessageBox(0,"BC setsockopt error.",0,0);   return;   }   char *tmpBuf = msg->GetBuffer();   if (SOCKET_ERROR == sendto(m_socket, tmpBuf, msg->GetLength(), 0, (PSOCKADDR)&sin, sizeof(sin)))   {   // Error occurred   ::MessageBox(0,"BC sendto error.",0,0);   return;   }closesocket(m_socket);    相关信息   - 所有的设置信息都保存在注册表的以下位置:   \\HKEY_CURRENT_USER\Software\HSTools\   用户密码以不可逆加密方式存储.   *******************************************************************   * 如果你忘记了密码, 可以在注册表将此键删除 *   * \\HKEY_CURRENT_USER\Software\HSTools\IPMsgEng\PasswordStr *   *******************************************************************   - 本软件使用的默认端口为 2425   若仅使用 UDP 协议的端口, 将不能传送文件/文件夹   (如果安装了防火墙, 则必须打开相应的 TCP 和 UDP 端口)   - 本软件为自由软件, 你可以随意传播, 但源码使用请参见许可协议.   - 只有在启动或退出程序, 使用离开模式, 刷新在线用户时 IPMsg 才会进行消息广播.   - 本软件由 Microsoft Visual C++ 6.0 编译 广域网设置(广播设置)   - 主机号全部为 1 的 IP 地址, 即广播地址   例如, 连接到一个 C 类子网(即 24 位网络号, 8 位主机号), IP 地址为   aaa.bbb.ccc.ddd, 其广播地址即为: aaa.bbb.ccc.255   若对方处于另一个私有子网, 广播可能无效.   - 更多问题, 请参阅相关资料或咨询你的网络管理员.   - 若两台主机的连接经过了多个路由器, 请直接指定对方IP地址   - 拨号上网用户请勾选 [拨号连接]   当刷新在线用户列表时, 列表不会被清空 补充   - 启动飞鸽传书前, 你可以指定其运行时使用的端口,   且可以使用不同的端口打开多个窗口. 用法如下:   ipmsg.exe 2426 (你可在快捷方式上设置)   但是你只能与同时也使用该端口的用户通信.   - 所以你尽可选用你喜欢的端口运行本软件.   介于 10000 至 60000 可能更安全些.   你也可以咨询你的网络管理员.   - 如果有多个网卡(IP), 你可以将飞鸽传书与指定的网卡(IP)进行绑定.   命令格式如下(你可以在快捷方式上设置):   ipmsg.exe [端口] /NIC IP地址   例如:   C:\>ipmsg.exe /NIC 192.168.10.100   - 支持命令方式发送消息   命令格式如下:   ipmsg.exe [端口] /MSG [/LOG][/SEAL] <主机名或IP地址> <消息>   例如:   C:\>ipmsg.exe /MSG /SEAL localhost Hello.    支持   - IPMsg 的技术讨论区是开放的.   如果你想订阅相关邮件, 请联系 ipmsg-subscribe@ring.gr.jp   - 欢迎报告 bug, 以及提出建议   - 如果你有任何疑问, 请 E-mail 联系.   shirouzu@h.email.ne.jp   文版可联系阿志: hiwyz@163.net   - 发送错误报告, 请勿必记录以下信息:   软件版本, 操作系统, 故障描述, 以及故障重现方法等. 更新历史   ver 1.00 ... 日文版 (1996/08/19)   ver 1.31 ... 英文版/日文版 (1997/09/01)   ver 2.00 ... 英文版/日文版 (2002/11/19)   支持文件/文件夹传送   支持通信数据加密   ver 2.03 ... Bug 修正 (文件传送引起缓冲溢出)   广播设置支持主机地址(FQDN)解析   ver 2.04 ... 增加绑定网卡(IP)功能   ver 2.05 ... Bug 修正 (2.04版当激活发送/接收消息窗口时,无法注销/关闭系统)   ver 2.06 ... 很小的调整   ver 2007 ... 全面调整软件的界面可用性、性能稳定性 注意:本版本为 IPMSG 2.06版 编译环境: WINXP & VS2005, 可正确编译。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧