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