首页 文章

gtk_main后恢复控制

提问于
浏览
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回调很容易调用它,因为我可以访问widget和cr变量,但是我不知道如何从我的控制器类中调用它 .

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

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

相关问题