Перехват сигнала щелчка на Gtk::DrawingArea (gtkmm3)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Перехват сигнала щелчка на Gtk::DrawingArea (gtkmm3)

Сообщение Anonymous »

Я работаю над оптимизированным по скорости генератором фракталов, используя Glade и C++, и у меня возникли проблемы с пониманием некоторых тонкостей gtkmm.
Я пытаюсь перехватить событие щелчка из Gtk::DrawingArea, т.е. вызвать функцию при нажатии на него.
Я не могу создать объект EventBox с помощью стандартный конструктор. После долгих проб и ошибок мне удалось поймать событие щелчка в главном окне:

Код: Выделить всё

#include 
#include 
#include 
#include 

Gtk::Window* W_Main;
Gtk::DrawingArea* D_Fractal;

//Gtk::EventBox EB_CatchClick;

int AWidth;
int AHeight;
bool test;

gboolean on_D_Fractal_draw(const Cairo::RefPtr cr) {
AWidth = D_Fractal->get_width();
AHeight = D_Fractal->get_height();

//Draw background
cr->set_source_rgb(1.0, 1.0, 1.0);
if(test) {
cr->set_source_rgb(0.0, 0.0, 0.0);
}

cr->rectangle(10, 10, AWidth-20, AHeight-20);
cr->fill();

return 0;
}

gboolean on_W_Main_button_press_event(GdkEventButton *event) {
switch ( event->type )
{
case GDK_BUTTON_PRESS :
test = true;
std::cout get_widget("W_Main", W_Main);
builder->get_widget("D_Fractal", D_Fractal);

D_Fractal->signal_draw().connect(sigc::ptr_fun(on_D_Fractal_draw));
W_Main->signal_button_press_event().connect(sigc::ptr_fun(on_W_Main_button_press_event));

app->run(*W_Main);
}
Но простое включение строки EB_CatchClick = Gtk::EventBox() в main(int argc, char** argv) вместе с раскомментированием соответствующее объявление приводит к следующей ошибке.

Невозможно создать GtkStyleContext без подключения к экрану
Я нашел эту страницу, но структура их программы значительно отличается от моей, поэтому любая прямая передача вряд ли сработает. Буду благодарен за любые предложения.
РЕДАКТИРОВАТЬ: Я немного поработал над проблемой, и теперь код выглядит так:

Код: Выделить всё

#include 
#include 
#include 
#include 

Gtk::Window* W_Main;
Gtk::DrawingArea* D_Fractal;

Gtk::EventBox* EB_CatchClick;

int AWidth;
int AHeight;
bool test;

gboolean on_D_Fractal_draw(const Cairo::RefPtr cr) {
AWidth = D_Fractal->get_width();
AHeight = D_Fractal->get_height();

//Draw background
cr->set_source_rgb(1.0, 1.0, 1.0);
if(test) {
cr->set_source_rgb(0.0, 0.0, 0.0);
}

cr->rectangle(10, 10, AWidth-20, AHeight-20);
cr->fill();

return 0;
}

gboolean on_D_Fractal_button_press_event(GdkEventButton *event) {
switch ( event->type )
{
case GDK_BUTTON_PRESS :
test = true;
std::cout get_widget("W_Main", W_Main);
builder->get_widget("D_Fractal", D_Fractal);

EB_CatchClick = new Gtk::EventBox;
EB_CatchClick->set_size_request(600,400);
EB_CatchClick->add(*D_Fractal);

D_Fractal->signal_draw().connect(sigc::ptr_fun(on_D_Fractal_draw));
EB_CatchClick->signal_button_press_event().connect(sigc::ptr_fun(on_D_Fractal_button_press_event));

app->run(*W_Main);

delete EB_CatchClick;
}
Каким-то образом размещение Gtk::EventBox в куче привело к его компиляции. Однако теперь я получаю следующее сообщение об ошибке во время выполнения:

Код: Выделить всё

Attempting to add a widget with type
gtkmm__GtkDrawingArea to a container of type
gtkmm__GtkEventBox, but the widget is already
inside a container of type gtkmm__GtkWindow,
please remove the widget from its existing
container first.
Означает ли это, что мне нужно удалить Gtk::DrawingArea из моего Gtk::Window, добавить его в Gtk::EventBox > а затем добавить Gtk::EventBox в Gtk::Window? Это кажется ужасно неэлегантным решением (если оно вообще работает), и настоящим я хотел бы узнать об альтернативах.

Подробнее здесь: https://stackoverflow.com/questions/786 ... rea-gtkmm3
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»