我有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的错误还是我的代码不正确?
非常感谢。
答案 0 :(得分:0)
您确定您的deviceLabelBox可见吗?即它和它的所有父容器都可以看到顶层窗口吗?
你在做什么
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);
即。没有“&amp;”在“&amp;数据”中。您希望传递数据指针的值,而不是“data”参数的地址。