我正在使用C中的MVC设计模式创建一个GUI应用程序。它应该是一个连接游戏4。
我希望我的控制器能够将数据发送到GUI。我的GUI中有一个方法来绘制起始元素,例如用于选择要放入检查程序的列的板和按钮。
在这个方法结束时,我必须调用gtk_main()才能在屏幕上显示GUI。我希望能够在视图和控制器类之间发送数据,但是在调用此方法之后,控件不会返回给控制器类。
要清楚,main方法在我的控制器类中,它在我的视图类中调用'setup'方法,gtk_main()调用在'setup'方法的末尾。
如何解决此问题?
另外,例如,我在我看来有这种方法:
空隙 drop_checker(GtkWidget * widget,cairo_t * cr,gint col,gint row,int r,int g,int b)
使用GTK回调很容易调用它,因为我可以访问widget和cr变量,但是我不知道如何从我的控制器类中调用它。
这是设计应用程序的错误还是技术上的误解?
答案 0 :(得分:2)
我认为这是一个技术上的误解,导致您的应用程序设计不正确。对于GUI应用程序,您希望始终运行主循环,并且您的程序流应该是这样的
int main (int argc, char **argv)
{
<do setup>
<do UI setup>
gtk_main ();
return 0;
}
主循环仅在您调用gtk_main_quit();
时退出,并且通常仅在响应游戏通过窗口控件或菜单选项退出时才会退出。游戏中发生的所有其他事情都必须由主循环中的事件发生。您可以将回调附加到小部件上的信号,例如GtkButton上的“clicked”信号,或者如果您需要独立发生某些事情,您可以设置回调以使用g_timeout_add在特定时间调用,或者仅当主循环使用g_idle_add时调用。
(请注意,有些时候你确实想要在第一个循环中运行第二个循环,但这些循环很少,而且与你当前的情况无关,一般GTK +处理它们而你不需要知道细节)