c-执行函数后需要关闭GTK+窗口



我在linux程序上编程,我正在尝试用GTK+3准备程序,但我不知道在执行函数后如何自动关闭程序而不终止执行。

我想要在我的程序中的步骤是:

  1. 打开gtk窗口,这个窗口有按钮(打开Xreader(
  2. 按下按钮,它告诉系统执行xreader程序
  3. 自动关闭gtk窗口,而无需关闭xreader

这是我的代码

#include<stdio.h>
#include<gtk/gtk.h>
static void 
open_app(GtkWidget *Widget, gpointer data){
system("xreader");
gtk_main_quit();
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *button1;

gtk_init(&argc, &argv);
/*make window */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/*give name to the window*/
gtk_window_set_title(GTK_WINDOW(window), "launcher");
/*make size of window*/
gtk_window_set_default_size(GTK_WINDOW(window), 700, 700);
/*open the window in the meddal*/
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
button1 = gtk_button_new_with_label("Open Xreader");

gtk_container_add(GTK_CONTAINER(window), button1);
gtk_widget_show_all(window);
g_signal_connect(button1,"clicked",G_CALLBACK(open_app), NULL);
g_signal_connect(window, "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_main();
return 0;
}

每次尝试执行我的程序并按下按钮(打开外部阅读器(gtk不关闭,直到关闭外部阅读器

此处不能使用system,因为根据其文档,https://man7.org/linux/man-pages/man3/system.3.html

system((在命令完成后返回。

由于您使用的是gtk,请不要忘记glib提供的库函数。它有一系列与进程和线程处理相关的功能。例如,可以使用glib中的GSubprocess类g_subprocess_new。

#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
static void open_app(GtkWidget *Widget, gpointer data) {
g_subprocess_new(G_SUBPROCESS_FLAGS_NONE, NULL, "xreader", NULL);
gtk_main_quit();
}
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *button1;
gtk_init(&argc, &argv);
/*make window */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/*give name to the window*/
gtk_window_set_title(GTK_WINDOW(window), "launcher");
/*make size of window*/
gtk_window_set_default_size(GTK_WINDOW(window), 700, 700);
/*open the window in the meddal*/
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
button1 = gtk_button_new_with_label("Open Xreader");
gtk_container_add(GTK_CONTAINER(window), button1);
gtk_widget_show_all(window);
g_signal_connect(button1, "clicked", G_CALLBACK(open_app), NULL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_main();
return 0;
}

最新更新