Vala官网示例代码编译报错:Gtk.Button无click属性的解决方法
问题详情
尝试编译Vala官网的演示代码:
int main (string[] args) { var app = new Gtk.Application( "com.example.App", ApplicationFlags.FLAGS_NONE ); app.activate.connect(() => { var win = new Gtk.ApplicationWindow(app); var btn = new Gtk.Button.with_label("Hello World"); btn.click.connect(win.close); win.child = btn; win.present(); }); return app.run(args); }
使用编译命令:
$ valac --pkg gtk+-3.0 valademo.vala
编译时出现错误:
valademo.vala:13.5-13.13: error: The name `click' does not exist in the context of `Gtk.Button' btn.click.connect(win.close); ^^^^^^^^^ Compilation failed: 1 error(s), 0 warning(s)
问题原因
官网示例代码针对Gtk 4.x版本编写,但你使用的编译参数是gtk+-3.0(Gtk 3.x),两个版本API存在关键差异:
- Gtk 4.x中,Button的点击信号名为
click - Gtk 3.x中,对应的点击信号名为
clicked
同时,Gtk 3.x的窗口控件添加、显示逻辑也和Gtk 4.x不同。
解决方法
方法1:适配Gtk 3.x修改代码
将信号名改为clicked,同时调整窗口控件的添加和显示逻辑:
int main (string[] args) { var app = new Gtk.Application( "com.example.App", ApplicationFlags.FLAGS_NONE ); app.activate.connect(() => { var win = new Gtk.ApplicationWindow(app); var btn = new Gtk.Button.with_label("Hello World"); btn.clicked.connect(win.close); win.add(btn); // Gtk3使用add方法添加子控件 win.show_all(); // Gtk3需要手动调用show_all显示所有控件 win.present(); }); return app.run(args); }
保持原编译命令不变:
valac --pkg gtk+-3.0 valademo.vala
方法2:切换到Gtk 4.x编译
如果环境支持Gtk 4.x,无需修改代码,直接更换编译参数:
valac --pkg gtk4 valademo.vala
内容的提问来源于stack exchange,提问作者rnso
相关产品推荐
相关产品推荐

