lerosua’s blog


for循环中iterator不可乱删除

Posted in iTalk 由 lerosua on the 八月 19, 2007

今天写iTalk,想要把空组删除掉。
//tree_store就是列表中的数据(TreeStore)
//下面代码作用是扫描列表中的组,发现空组则删除。
Gtk::TreeModel::Children children = tree_store->children();
Gtk::TreeModel::iterator it_g;
it_g = children.begin();

for (; it_g != children.end(); ++it_g) {
Gtk::TreeModel::Children grandson = it_g->children();
if(grandson.begin()==grandson.end())
{
const Glib::ustring& tmp= (*it_g)[buddyColumns.id];
std::cout<<tmp<<”为空组=======================”<<std::endl;
tree_store->erase(it_g);
}
}

不过遇到了段错误。思前想后发现段错误的原因是因为那个删除 tree_store->erase(it_g);
执行了这句后,it_g所指向的数据已经失效,所以it_g++的话就会溢出。
把for 循环改成do while循环,用一个中间变量来得到it_g的值,并用它来删除。

do{
Gtk::TreeModel::Children grandson = it_g->children();
Gtk::TreeModel::iterator point = it_g;
it_g++;
if(grandson.begin()==grandson.end())
{
//const Glib::ustring& tmp= (*point)[buddyColumns.id];
//std::cout<<tmp<<”为空组=======================”<<std::endl;
tree_store->erase(point);
}

}
while(it_g!=children.end());
嗯。这样也算是解决问题吧。

如何编译iTalk

Posted in iTalk 由 lerosua on the 八月 10, 2007

前面我已经发过iTalk的截图了。为了让大家有更多的了解,现在发布编译的方法。
声明:由于这是一个开发中的版本,会遇到很多问题,强烈建议您有强壮的心脏和
心理准备来体验您将要做的事。

重要:由于测试的方便,代码里会有一个叫cyclonb@gmail.com的帐号和密码。我们
希望您不要用这个帐号登录和对这个帐号做密码更改之类的事情,这是我们用于测试用的。
谢谢合作。非常感谢。

iTalk是以gloox为协议基础。所以你必须编译安装好gloox库才能正常编译iTalk,
一般的系统可能已经提供了gloox库。但我强烈建议您卸载它。因为系统所提供的
gloox是一般比较过时。而iTalk所使用的gloox会比较新。因为是处于开发状态,iTalk
和gloox的svn版本变化会比较多。容易出现版本不兼容导致不能编译的结果,这也是
我之前建议您等待我们发布整合版本而不是自己编译的原因。

1.首先从源里取出gloox库的2420版本。(这是iTalk现在使用的版本)

svn co svn://svn.camaya.net/gloox/trunk gloox -r2420

然后是编译安装
cd gloox
./autogen.sh
./configure
make
sudo make install
(如果还有不明白的,请参考http://camaya.net/glooxdownload)

2.然后取出iTalk的源代码。(实际上,iTalk在申请项目名的时候叫geekr,当然关于
名字的问题我们以后再讨论)

svn checkout *http*://geekr.googlecode.com/svn/trunk/ iTalk
进入目录编译:
cd iTalk
./configure
make
sudo make install

现在您可以通过命令行italk来启动程序了。

如果您有好的建议请发到Cyclone_QQ@googlegroups.com邮件列表来。谢谢讨论。

libglade中的Notebook控件不要有空页

Posted in iTalk 由 lerosua on the 八月 7, 2007

libglade中的Notebook控件不要有空页

今天在写iTalk的时候。准备加一个显示登录状态时显示的
动画这样的功能。于是在主窗口上加一个NoteBook控件。
准备在登录中显示那个动画的页,登录成功则显示好友列
表的页。

用glade画好Notebook控件后。程序加载后显示有一个警告:

(italk:31101): Gtk-CRITICAL **: gtk_notebook_set_tab_label: assertion `GTK_IS_WIDGET (child)’ failed

(http://lists.ximian.com/pipermail/glade-users/2004-August/002014.html)
(查到的资料地址,解决方案)
google一下才知道。这是因为我画的Notebook控件有三页,
而我只用了其中两页。就是有一页为空。而libglademm处理
这个空页时产生的这个警告。只需要去掉这个空页,或者在空
页里随便加一个Vbox控件令它不为空就行了。这问题在Notebook
页设为0时也会出现。这对于libglade也是一样。所以标题用这个。
我看用C和libglade的人会比用C++和libglademm的人多吧。

project temporarily name italk preview

Posted in iTalk, soft 由 lerosua on the 七月 31, 2007