Всем добра! Пишу одну прогу на Vala, и возник такой вопрос. Как вынести все обработчики событий в отдельный файл?
набросал простую прогу, чтобы подробнее объяснить, что я хочу сделать.
есть класс, который создаёт GUI (GUI.vala)
using Gtk;
namespace GUI
{
public class GUI_Appl : Window
{
private Button button;
private Label label;
public GUI_Appl ()
{
this.title = "Sample";
this.window_position = WindowPosition.CENTER;
this.destroy.connect(Gtk.main_quit);
this.set_resizable(false);
var grid = new Grid();
button = new Button.with_label("Кнопка");
grid.attach(button, 0, 0, 1, 1);
label = new Label.with_mnemonic("Это строка");
grid.attach(label, 1, 0, 1, 1);
this.add(grid);
}
}
}
есть "главный файл" (Sample.vala) с методом main()
using GUI;
public static int main (string[] args)
{
Gtk.init (ref args);
var window = new GUI_Appl();
window.show_all();
Gtk.main();
return 0;
}
при такой связке, всё собирается и запускается.
valac --pkg gtk+-3.0 GUI.vala Sample.vala --output sample
Но у меня ещё есть файл с обработчиками событий (Signals.vala)
его кидаю к остальным (чуть меняя их) и выходит вот так..
kirra@desktop:~/Документы/Doc/DDS/Sample$ valac --pkg gtk+-3.0 GUI.vala Sample.vala Signals.vala --output sample
Signals.vala:7.5-7.22: error: Access to private member `GUI.GUI_Appl.label' denied
GUI.GUI_Appl.label.set_text("Я новая строка");
^^^^^^^^^^^^^^^^^^
GUI.vala:23.32-23.50: error: invocation of void method not allowed as expression
button.clicked.connect(Signals.my_signal());
^^^^^^^^^^^^^^^^^^^
Compilation failed: 2 error(s), 0 warning(s)
kirra@desktop:~/Документы/Doc/DDS/Sample$ файлы выглядят так
using Gtk;
using Signals;
namespace GUI
{
public class GUI_Appl : Window
{
private Button button;
private Label label { get; set; }
public GUI_Appl ()
{
this.title = "Sample";
this.window_position = WindowPosition.CENTER;
this.destroy.connect(Gtk.main_quit);
this.set_resizable(false);
var grid = new Grid();
button = new Button.with_label("Кнопка");
grid.attach(button, 0, 0, 1, 1);
button.clicked.connect(Signals.my_signal());
label = new Label.with_mnemonic("Это строка");
grid.attach(label, 1, 0, 1, 1);
this.add(grid);
}
}
}
using GUI;
namespace Signals
{
public void my_signal()
{
GUI.GUI_Appl.label.set_text("Я новая строка");
}
}
using GUI;
public static int main (string[] args)
{
Gtk.init (ref args);
var window = new GUI_Appl();
window.show_all();
Gtk.main();
return 0;
}
вопросы такие: почему "Access to private member `GUI.GUI_Appl.label' denied", ведь я указываю геттеры и сеттеры для label?
и почему "invocation of void method not allowed as expression", получается, что метод, передаваемый в обработчику не может быть
void?
В итоге, что хочу получить, чтобы кнопка обрабатывала нажатие мемтодом
my_signal() из
Signal.valaP.S. сейчас читаю про сигналы, возможно тут надо было применить именно их. Если кому не сложно, то покажите как на моём примере применить сигнал:)
Пользователь решил продолжить мысль 11 Ноября 2014, 14:43:15:
Вот и этот маленький проект