1

我正在使用 C 中的 MVC 设计模式创建一个 GUI 应用程序。它是一个连接 4 的游戏。

我希望我的控制器能够将数据发送到 GUI。我在我的 GUI 中有一个方法来绘制起始元素,例如用于选择将检查器放入哪一列的板和按钮。

在此方法结束时,我必须调用 gtk_main() 以使 GUI 显示在屏幕上。我希望能够在视图和控制器类之间发送数据,但是在调用此方法后,控制权不会返回给控制器类。

需要明确的是,main 方法在我的控制器类中,它在我的视图类中调用“setup”方法,gtk_main() 调用位于“setup”方法的末尾。

我该如何解决这个问题?

另外,例如,我认为我有这种方法:

void drop_checker(GtkWidget *widget, cairo_t *cr, gint col, gint row, int r, int g, int b)

使用 GTK 回调很容易调用它,因为我可以访问小部件和 cr 变量,但是我不知道如何从我的控制器类中调用它。

这是应用程序设计方式的错误,还是技术上的误解?

4

1 回答 1

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+ 会在您不需要了解细节的情况下处理它们)

于 2013-02-09T06:48:49.273 回答