我正在尝试用两个FileChooserButtons创建一个窗口。第一个应该帮助用户选择一个目录,因此我使用操作Select_folder;第二个是允许用户选择一个文件。
问题是,我希望第二个文件夹根据用户在第一个文件夹中的选择更改当前文件夹。
我最初的想法是使用Signal.connect,如行中所示:
Signal.connect(chooser1, "selection_changed", folder_changed, null)但是,这会导致以下编译错误:
exercise4_1.gs:62.55-62.68: error: Cannot create delegate without target for instance method or closure
Signal.connect(chooser1, "selection_changed", folder_changed, null)
^^^^^^^^^^^^^^
Compilation failed: 1 error(s), 0 warning(s)我还试着在vala邮件列表中按照这个folder_changed添加(回调) 邮件通信,但没有效果。
以下是整个代码:
[indent=4]
uses
Gtk
GLib
class TestWindow : Window
chooser1:Gtk.FileChooserButton
chooser2:Gtk.FileChooserButton
construct()
// General characteristics of the window
title = "File chooser"
window_position = WindowPosition.CENTER
destroy.connect(Gtk.main_quit)
chooser1 = new FileChooserButton(
"Choose a Folder",
FileChooserAction.SELECT_FOLDER
)
chooser2 = new FileChooserButton(
"Chooser a Folder",
FileChooserAction.OPEN
)
chooser1.set_current_folder(Environment.get_home_dir())
chooser2.set_current_folder(Environment.get_home_dir())
Signal.connect(chooser1, "selection_changed", folder_changed, null)
var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0)
box.pack_start(chooser1, true, true,0)
box.pack_start(chooser2, true, true,0)
add(box)
def folder_changed()
var folder = chooser1.get_filename()
chooser2.set_current_folder(folder)
init
Gtk.init (ref args)
var test = new TestWindow ()
test.show_all ()
Gtk.main ()发布于 2016-01-09 18:37:18
Gtk的回调需要包含生成信号的对象的参数。此外,Genie和Vala对GLib信号有语法支持,以使信号更易于使用。下面是一个基于代码的示例:
[indent=4]
uses
Gtk
class TestWindow:Window
_file_chooser:FileChooserButton
construct()
title = "File chooser"
window_position = WindowPosition.CENTER
destroy.connect( Gtk.main_quit )
var folder_chooser = new FileChooserButton(
"Choose a Folder",
FileChooserAction.SELECT_FOLDER
)
folder_chooser.set_current_folder( Environment.get_home_dir() )
folder_chooser.selection_changed.connect( folder_changed )
_file_chooser = new FileChooserButton(
"Chooser a File",
FileChooserAction.OPEN
)
_file_chooser.set_current_folder( Environment.get_home_dir() )
var box = new Box( Orientation.VERTICAL, 0 )
box.pack_start( folder_chooser, true, true, 0 )
box.pack_start( _file_chooser, true, true, 0 )
add( box )
def folder_changed( folder_chooser_widget:FileChooser )
folder:string = folder_chooser_widget.get_uri()
_file_chooser.set_current_folder_uri( folder )
init
Gtk.init( ref args )
var test = new TestWindow()
test.show_all()
Gtk.main()有几点需要注意:
"selection_changed"已经成为folder_chooser的一个属性,然后是connect。Vala编译器在编译时完成对GLib.Signal的转换。FileChooserButton,folder_chooser,已从类的作用域中删除。现在通过将它作为参数传递给回调来访问它。因此,它被定义为回调函数的参数。FileChooser类型,而不是FileChooserButton类型。这是因为selection_changed信号是FileChooserButton随后实现的FileChooser接口的一部分。这实际上为FileChooserButton提供了多个类型_file_chooser被声明为在类的整个范围内都可用,但只有在类中使用下划线才能访问它。使用Signal.connect()更接近于Gtk的closer。如果您需要这样做,那么以下工作将基于您的原始代码:
[indent=4]
uses
Gtk
class TestWindow:Window
chooser1:FileChooserButton
chooser2:FileChooserButton
construct()
// General characteristics of the window
title = "File chooser"
window_position = WindowPosition.CENTER
destroy.connect( Gtk.main_quit )
chooser1 = new FileChooserButton(
"Choose a Folder",
FileChooserAction.SELECT_FOLDER
)
chooser2 = new FileChooserButton(
"Chooser a Folder",
FileChooserAction.OPEN
)
chooser1.set_current_folder( Environment.get_home_dir() )
chooser2.set_current_folder( Environment.get_home_dir() )
Signal.connect(
chooser1,
"selection_changed",
(GLib.Callback)folder_changed,
self
)
var box = new Box( Orientation.VERTICAL, 0 )
box.pack_start( chooser1, true, true, 0 )
box.pack_start( chooser2, true, true, 0 )
add( box )
[CCode( instance_pos = 2 )]
// or [CCode( instance_pos = -1 )] to always be last
def folder_changed( folder_chooser:Widget )
folder:string = chooser1.get_uri()
chooser2.set_current_folder_uri( folder )
init
Gtk.init( ref args )
var test = new TestWindow()
test.show_all()
Gtk.main()有几点需要注意:
GLib.Callback,就像您在链接到的邮件中发现的那样Window对象,因此将null更改为self在这里有效。CCode属性,在本例中为[CCode( instance_pos = 2 )]。Widget类型,但可以将其更改为FileChooser以使用get_uri()调用对于代码格式问题,如您所见,我更喜欢分割长行。到目前为止,我还不确定对精灵是否有一致的“最佳实践”。
https://stackoverflow.com/questions/34689763
复制相似问题