今天,准确地说是昨天,遇到一个很诡异的问题,这个问题并不常见:
用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了。