Элементы управления исчезают, когда появляется окно сообщения C ++ GTK - PullRequest
0 голосов
/ 23 апреля 2020

Я запрограммировал GUI в C ++.

#include <gtk/gtk.h>
#include <unistd.h>
#include <cstddef>
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
int main(){
    GtkWidget *_LinuxWindow, *_Box, *_Button;
    int argC = 0;
    char** argV;
    // Setup the window and fixed grid
    gtk_init(&argC,&argV);
    _LinuxWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    _Box = gtk_fixed_new();
    // Set the title
    gtk_window_set_title(GTK_WINDOW(_LinuxWindow),"Title");
    // Finish up
    gtk_widget_show(_LinuxWindow);
    g_signal_connect(G_OBJECT(_LinuxWindow),"destroy",G_CALLBACK(gtk_main_quit), NULL);
    // Add controls
    _Button = gtk_button_new_with_label("Click Me!");
    gtk_fixed_put(GTK_FIXED(_Box),_Button,20,20);
    gtk_fixed_move(GTK_FIXED(_Box),_Button,20,20);
    gtk_widget_show(_Box);
    gtk_widget_set_size_request(_Button,30,100);
    // Create a dialog
    GtkWidget *dialog;
    dialog =  gtk_message_dialog_new(GTK_WINDOW(_LinuxWindow), GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_OK_CANCEL,"OK or Cancel?",NULL,g_strerror(errno));
    gint ret = gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(GTK_WIDGET(dialog));
    printf("%i", ret);
    // Add the fixed grid and go the to the main window loop
    gtk_container_add(GTK_CONTAINER(_LinuxWindow),_Box);
    gtk_widget_show(_Box);
    gtk_widget_show_all(_LinuxWindow);
    gtk_main();


    return 0;
}

Когда я запускаю его, используя

g++ -o out-withoutCross without-cross.cpp -lX11 `pkg-config --cflags gtk+-3.0`pkg-config --libs gtk+-3.0`

Появляется окно сообщения и окно. Проблема в том, что элементы управления в окне не отображаются, пока открыто окно сообщения. Я думаю, что это может быть потому, что окно сообщения запускается в том же потоке, что и главное окно. Есть ли способ добавить многопоточность в GTK?

Кроме того, возвращаемое значение окна сообщения, выводимого на консоль, выполняется после выхода из главного окна.

1 Ответ

1 голос
/ 23 апреля 2020

Проблема в структуре вашего кода .. \

#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
  GtkWidget *_LinuxWindow, *_Box, *_Button;
  int argC = 0;
  char **argV;
  // Setup the window and fixed grid
  gtk_init(&argC, &argV);
  _LinuxWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  _Box = gtk_fixed_new();
  // Set the title
  gtk_window_set_title(GTK_WINDOW(_LinuxWindow), "Title");
  // Finish up
  gtk_widget_show_all(_LinuxWindow);
  g_signal_connect(G_OBJECT(_LinuxWindow), "destroy", G_CALLBACK(gtk_main_quit),
                   NULL);
  // Add controls
  _Button = gtk_button_new_with_label("Click Me!");
  gtk_fixed_put(GTK_FIXED(_Box), _Button, 20, 20);
  gtk_fixed_move(GTK_FIXED(_Box), _Button, 20, 20);
  gtk_widget_set_size_request(_Button, 30, 100);
  gtk_container_add(GTK_CONTAINER(_LinuxWindow), _Box);
  gtk_widget_show_all(_LinuxWindow);
  // Create a dialog
  GtkWidget *dialog;
  dialog = gtk_message_dialog_new(
      GTK_WINDOW(_LinuxWindow), GTK_DIALOG_DESTROY_WITH_PARENT,
      GTK_MESSAGE_INFO, GTK_BUTTONS_OK_CANCEL, "OK or Cancel?", NULL);
  gint ret = gtk_dialog_run(GTK_DIALOG(dialog));
  gtk_widget_destroy(GTK_WIDGET(dialog));
  printf("%i", ret);
  // Add the fixed grid and go the to the main window loop

  gtk_main();

  return 0;
}

gtk_dialog_run - это блокирующая функция, поэтому она будет ждать, пока не получит ответ из диалогового окна ... чтобы продолжить

В своем коде вы добавляете кнопку в окно только после запуска диалогового окна (которое является блокирующим вызовом), поэтому после ее выполнения кнопка добавляется в окно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...