【发布时间】:2014-01-05 18:37:20
【问题描述】:
我用 c - Black & Scholes 开发了一个财务计算器。我的老师希望我为此实现一个 GUI,他建议使用 GTK。由于我对 c 的了解不足(从一开始就是 java 程序员),这对我来说几乎是太多了,因为截止日期是 4 小时。但是经过辛勤工作和对stackoverflow的良好帮助,我想我有机会做到!但是现在有一个令人讨厌的障碍需要克服—— 那就是将多个条目传递给一个方法。简而言之 - 有五个输入字段,我想要的是通过 g_signal_connect_swapped 将所有这些发送到我提取调用字符串的方法。问题是只要只有一个字符串(一个条目),我就能够做到这一点(感谢帮助)。但是如何将所有这些条目发送到函数?
我试图声明一个向量但没有成功。由于错误,它甚至无法编译。
static GtkWidget entry[5]
由于数组是一个指针(指向第一个元素),它应该可以工作 - 但不是!
更奇怪的是——我有另一个想法——我没有发送条目,而是尝试在主方法中提取字符串值——与函数中的语法完全相同——但没有成功。该值为空。
const gchar *text;
text = gtk_entry_get_text(GTK_ENTRY (entry_a));
printf ("Result: %s\n", text);
上面的 sn-p 在函数中按expexted 工作 - 但在主函数中没有。为什么???
希望您理解我的问题 - 下面是生成 GUI 的代码。代码没有错误 - 这就是我将一个条目值发送到回调函数的地方。
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
static GtkWidget *asset_label;
static GtkWidget *frame;
static GtkWidget *entry_a, *entry_s, *entry_v, *entry_t, *entry_r;
static GtkWidget *label_a, *label_s, *label_v, *label_t, *label_r;
static GtkWidget *window, *result_label, *button;
static GtkWidget *table;
static void entry_Submit(GtkWidget *entry, GtkWidget *widget) {
const gchar *text;
text = gtk_entry_get_text(GTK_ENTRY (entry_a));
printf ("Result: %s\n", text);
gtk_widget_destroy(GTK_WIDGET(label_a));
label_a = gtk_label_new (text);
gtk_grid_attach (GTK_GRID (table), label_a, 1, 0, 1, 1);
gtk_widget_show(label_a);
}
static void destroy(GtkWidget *widget, gpointer data) {
gtk_main_quit ();
}
static void initialize_window(GtkWidget* window) {
gtk_window_set_title(GTK_WINDOW(window),"My Window"); //Set window title
gtk_window_set_default_size (GTK_WINDOW (window), 400, 200); //Set default size for the window
g_signal_connect (window, "destroy", G_CALLBACK (destroy), NULL); //End application when close button clicked
}
int main (int argc, char *argv[]) {
//GtkWidget *window,*table,*label, *button;
gtk_init(&argc, &argv);
//Create the main window
//window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//initialize_window(window);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (GTK_WIDGET (window), 300, 300);
gtk_window_set_title (GTK_WINDOW (window), "FINANCIAL CALCULATOR");
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect_swapped (window, "delete-event", G_CALLBACK (gtk_widget_destroy), window);
/* Create a 1x2 table */
table = gtk_grid_new ();
gtk_container_add (GTK_CONTAINER (window), table);
//create a text box (asset price)
entry_a = gtk_entry_new ();
gtk_grid_attach (GTK_GRID (table), entry_a, 0, 0, 1, 1);
// create a new label.
label_a = gtk_label_new (" ASSET PRICE" );
gtk_grid_attach (GTK_GRID (table), label_a, 1, 0, 1, 1);
//create a text box (strike price)
entry_s = gtk_entry_new ();
gtk_grid_attach (GTK_GRID (table), entry_s, 0, 1, 1, 1);
// create a new label.
label_s = gtk_label_new (" STRIKE PRICE" );
gtk_grid_attach (GTK_GRID (table), label_s, 1, 1, 1, 1);
//create a text box (time to maturity)
entry_t = gtk_entry_new ();
gtk_grid_attach (GTK_GRID (table), entry_t, 0, 2, 1, 1);
// create a new label.
label_t = gtk_label_new (" TIME TO MATURITY" );
gtk_grid_attach (GTK_GRID (table), label_t, 1, 2, 1, 1);
//create a text box (volatility)
entry_v = gtk_entry_new ();
gtk_grid_attach (GTK_GRID (table), entry_v, 0, 3, 1, 1);
// create a new label.
label_v = gtk_label_new (" VOLATILITY" );
gtk_grid_attach (GTK_GRID (table), label_v, 1, 3, 1, 1);
//create a text box (interest rate)
entry_r = gtk_entry_new ();
gtk_grid_attach (GTK_GRID (table), entry_r, 0, 4, 1, 1);
// create a new label.
label_r = gtk_label_new (" INTEREST RATE" );
gtk_grid_attach (GTK_GRID (table), label_r, 1, 4, 1, 1);
button = gtk_button_new_with_label("Calculate");
g_signal_connect_swapped (button, "clicked", G_CALLBACK (entry_Submit), entry_a);
gtk_grid_attach (GTK_GRID (table), button, 0, 5, 2, 1);
gtk_widget_show_all(window);
gtk_main ();
return 0;
}
这些是我声明 GtkWidget 数组时的错误
1) 在 entry_submit 回调函数() 中我声明如下:
text = gtk_entry_get_text(GTK_ENTRY (entry[0]));
编译错误:错误:下标值既不是数组也不是指针也不是向量
2) 在我声明以下内容的主函数中:
entry[0] = gtk_entry_new ();
错误:从类型“struct GtkWidget *”分配给类型“GtkWidget”时类型不兼容
【问题讨论】:
-
那是什么操作系统