关于GtkEntry无法键入光标

今天,准确地说是昨天,遇到一个很诡异的问题,这个问题并不常见:

用GTK创建文本输入框(GtkEntry),编译通过并生成exe后运行,发现根本不能输入文本,甚至连光标都无法键入。

示例代码如下:

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {

	GtkWidget *window;
	GtkWidget *entry;

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_window_set_title(GTK_WINDOW(window), "GtkEntry");
	gtk_container_set_border_width(GTK_CONTAINER(window), 10);

	entry = gtk_entry_new();

	gtk_container_add (GTK_CONTAINER (window), entry);
	gtk_widget_show_all(window);

	g_signal_connect(window, "destroy",
		G_CALLBACK(gtk_main_quit), NULL);

	gtk_main();

	return 0;
}

上面的代码当然只是作为演示,运行截图如下:

无论我怎么拼命地在文本框中点击鼠标,光标就是进不去,这让我非常苦恼。由于接触GTK也不是很久,一开始就是检查代码,确定代码无误之后,我将代码发给师兄,在他那里运行竟然完全正确!

也许是环境没有配置好。我用的是Visual Studio 2005,系统是64位的Windows 7。在将开发环境重新搭建甚至后来重装了系统之后,居然还是没有用!真是郁闷。

于是在网上找找原因,没有直接解决这个问题的。

但是偶然看到一篇文章:http://fitren.i.sohu.com/blog/view/93178466.htm

这里边的代码我拷过来运行,居然可以在里边的文本框输入文本,这让我看到了希望,于是好好的比较了两段代码。

总算找出问题所在:设置各个控件显示的语句的位置。

我的代码是将所有控件创建布局好了之后,在最后来一句gtk_widget_show_all(window);

而他的代码,是每创建一个控件并稍作设置之后,就用gtk_widget_show()函数显示。

后来经过不断的测试发现,主要是设置主窗口window的显示。很多人都喜欢在最后来一句gtk_widget_show_all(window);

这样当然非常方便,但是一些罕见的问题也许就会发生,就好比我遇到的。针对我上面的问题,我的解决办法是:

在gtk_widget_show_all(window);前边添加gtk_widget_show(window);

这样,运行之后如下:

就在我沾沾自喜的时候,突然发现不加gtk_widget_show(window);这句,也能够输入,前提是运行时带着控制台窗口。我们在开发时通常带着控制台窗口以便测试,最后再将它去掉。在我的电脑上运行的时候,同时弹出上面的GtkEntry窗口以及控制台窗口,但是默认选中的是GtkEntry窗口,此时如果先选中一下控制台窗口,再回来选中GtkEntry窗口,就可以输入文本框了。

但是这样,麻烦不说,以后把控制台黑框去掉,还是不管用。所以,上面的解决方法还是必要的。

这个问题并不常见,我用的是64位Windows 7 + Visual Studio 2005,估计跟系统和机器有关。

至于为什么会有上面的问题,那要深入研究GTK了。

PS:原来之前的代码在师兄那边可以正确运行,是因为可执行DLL版本不同。我们知道,为了使得GTK程序可以正确执行,我们需要在生成的exe目录下添加很多DLL文件。我用原始的代码生成exe,再加上师兄用的DLL,果然可以正确执行。

把好用的DLL的路径加到Path中吧。

转载于:https://my.oschina.net/plumsoft/blog/79793

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值