Vala-Gtk下拉框示例代码编译报错,求问题定位与修复
Vala GTK ComboBox 编译错误修复
原始代码与编译错误
我尝试用以下Vala代码创建GTK ComboBox:
public class My_combobox{ private Gtk.ListStore liststore; private ComboBox combobox; liststore = new Gtk.ListStore(1, typeof (string)); Gtk.TreeIter iter; liststore.append(out iter); liststore.set(iter, 0, "Rafael Nadal", -1); liststore.append(out iter); liststore.set(iter, 0, "Roger Federer", -1); liststore.append(out iter); liststore.set(iter, 0, "Novak Djokovic", -1); cellrenderertext = new CellRendererText(); combobox = new ComboBox(); combobox.set_model(liststore); combobox.pack_start(cellrenderertext, true); combobox.add_attribute(cellrenderertext, "text", 0); //combobox.changed.connect(on_combobox_changed); }
执行编译命令:
$ valac formatGUI_v2.vala --pkg=gtk+-3.0
得到错误:
formatGUI_v2.vala:65.12-65.12: error: syntax error, expected identifier liststore = new Gtk.ListStore(1, typeof (string)); ^ formatGUI_v2.vala:65.31-65.31: error: syntax error, `new' modifier not allowed on creation method liststore = new Gtk.ListStore(1, typeof (string)); ^ formatGUI_v2.vala:73.44-73.44: error: syntax error, `new' modifier not allowed on creation method cellrenderertext = new CellRendererText(); ^ formatGUI_v2.vala:74.25-74.25: error: syntax error, `new' modifier not allowed on creation method combobox = new ComboBox(); ^ Compilation failed: 4 error(s), 0 warning(s)
尝试修改后的代码及错误
我把代码放到构造函数中,但仍报错:
public class My_combobox{ public void My_combobox(){ private Gtk.ListStore liststore; private ComboBox combobox; liststore = new Gtk.ListStore(1, typeof (string)); Gtk.TreeIter iter; liststore.append(out iter); liststore.set(iter, 0, "Rafael Nadal", -1); liststore.append(out iter); liststore.set(iter, 0, "Roger Federer", -1); liststore.append(out iter); liststore.set(iter, 0, "Novak Djokovic", -1); cellrenderertext = new CellRendererText(); combobox = new ComboBox(); combobox.set_model(liststore); combobox.pack_start(cellrenderertext, true); combobox.add_attribute(cellrenderertext, "text", 0); //combobox.changed.connect(on_combobox_changed); } }
编译命令(GTK2为例):
$ valac formatGUI_v2.vala --pkg=gtk+-2.0
错误信息:
formatGUI_v2.vala:64.11-64.13: error: syntax error, following expression/statement delimiter `;' missing private Gtk.ListStore liststore; ^^^ formatGUI_v2.vala:64.14-64.14: error: syntax error, expected identifier private Gtk.ListStore liststore; ^ formatGUI_v2.vala:66.13-66.13: error: syntax error, expected identifier liststore = new Gtk.ListStore(1, typeof (string)); ^ formatGUI_v2.vala:66.32-66.32: error: syntax error, `new' modifier not allowed on creation method liststore = new Gtk.ListStore(1, typeof (string)); ^ formatGUI_v2.vala:74.42-74.42: error: syntax error, `new' modifier not allowed on creation method cellrenderertext = new CellRendererText(); ^ formatGUI_v2.vala:75.26-75.26: error: syntax error, `new' modifier not allowed on creation method combobox = new ComboBox(); ^ Compilation failed: 6 error(s), 0 warning(s)
错误原因分析
- 代码不能直接写在类根作用域:Vala类定义中只能放成员变量声明、方法定义,执行语句(如赋值、实例化)必须放在方法(比如构造函数)内部。
- 构造函数写法错误:
- 构造函数不能声明返回值(不能写
public void My_combobox()),Vala构造函数需与类同名且无返回值声明。 - 方法内部不能用
private修饰变量,private是类成员的访问修饰符,局部变量无需加访问修饰符。
- 构造函数不能声明返回值(不能写
- 未声明局部变量:代码中使用的
cellrenderertext未声明类型。 - 类型前缀缺失:部分GTK类型未加
Gtk.前缀(或未添加using Gtk;语句),导致编译器无法识别。
正确修复后的代码
public class My_combobox { // 类成员变量声明 private Gtk.ListStore liststore; private Gtk.ComboBox combobox; private Gtk.CellRendererText cellrenderertext; // 正确的构造函数:无返回值,与类同名 public My_combobox() { // 初始化ListStore liststore = new Gtk.ListStore(1, typeof(string)); Gtk.TreeIter iter; // 添加列表项 liststore.append(out iter); liststore.set(iter, 0, "Rafael Nadal", -1); liststore.append(out iter); liststore.set(iter, 0, "Roger Federer", -1); liststore.append(out iter); liststore.set(iter, 0, "Novak Djokovic", -1); // 初始化CellRenderer和ComboBox cellrenderertext = new Gtk.CellRendererText(); combobox = new Gtk.ComboBox(); combobox.set_model(liststore); combobox.pack_start(cellrenderertext, true); combobox.add_attribute(cellrenderertext, "text", 0); // combobox.changed.connect(on_combobox_changed); } }
编译说明
- 若不想写
Gtk.前缀,可在文件开头添加using Gtk;语句。 - 根据GTK版本选择编译参数:GTK3用
--pkg=gtk+-3.0,GTK2用--pkg=gtk+-2.0。
内容的提问来源于stack exchange,提问作者rnso
相关产品推荐
相关产品推荐

