GTK: создание кнопки с помощью GtkWidget не работает постоянно - PullRequest
0 голосов
/ 12 ноября 2011

У меня есть 2 машины, на которых установлены разные версии Ubuntu (и, возможно, для самой GTK), и отображение кнопки работает на одной машине, но не на другой.

На одной машине все работает нормально, но на моей другой машине код срабатывает, но кнопка не появляется и ошибка не генерируется. Это код, который я использую для генерации кнопки:

static void addDeviceLabels(GtkWidget *widget, vector<device>* connectedDevices, inputData * data)
{
    GtkWidget *deviceButton;
    /* Create the string here (not shown) */
    const gchar * gdevice = (gchar*)(str.c_str());

    deviceButton = gtk_button_new_with_label(gdevice);
    g_signal_connect(G_OBJECT(deviceButton), "button_press_event", G_CALLBACK(connectToDevice), (gpointer) &data);
    gtk_box_pack_start(GTK_BOX(data->deviceLabelBox), deviceButton, FALSE, FALSE, 0);
    gtk_widget_show(deviceButton);
}

Я изначально создаю структуру следующим образом:

struct inputData {
    GtkWidget *ip;
    GtkWidget *pr;
    GtkWidget *deviceLabelBox;
};

struct inputData input;

Main затем звонит:

g_signal_connect(refreshButton, "clicked", G_CALLBACK(refreshList), &input);

и в refreshList:

static void refreshList(GtkWidget *widget, inputData * data)
{
    /* .... */
    addDeviceLabels(widget, connectedDevices, data);
}

Я надеюсь, что можно создать кнопку из сигнала, но она работает на одной машине.

Я не уверен, почему этот код работает на одной машине, а не на другой. Я уверен, что «addDeviceLabels» срабатывает, и моя строка идентична. Это может быть ошибка в GTK или мой код неверен?

Большое спасибо.

1 Ответ

0 голосов
/ 17 ноября 2011

Вы уверены, что ваше устройство LabelBox видно? То есть виден ли он и все его родительские контейнеры вплоть до окна верхнего уровня?

Вы делаете

g_signal_connect(G_OBJECT(deviceButton), "button_press_event", G_CALLBACK(connectToDevice), (gpointer) &data);

Последний аргумент неверен; ты хочешь

g_signal_connect(G_OBJECT(deviceButton), "button_press_event", G_CALLBACK(connectToDevice), (gpointer) data);

т.е. без "&" в "& data". Вы хотите передать значение указателя данных, а не адрес аргумента «данные».

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