Добавить изображение к кнопке при нажатии - PullRequest
0 голосов
/ 28 мая 2020
button1_on_image = Gtk::manage(new Gtk::Image{"button1_on.png"});   // Load icon
button1_off_image = Gtk::manage(new Gtk::Image{"button1_off.png"}); //   images
button1 = Gtk::manage(new Gtk::ToolButton{*button1_off_image});  // Create button
button1->set_tooltip_markup("Select one stick");                //   with image
button1->signal_clicked().connect(sigc::mem_fun(*this, 
    &Main_window::on_button1_click));
toolbar->append(*button1);

Это фрагмент кода, показывающий, как я успешно делаю кнопку. Проблема в том, что при нажатии я хочу, чтобы вместо button1_off.png отображался «button1_on.png», но я не знаю, как это сделать.

1 Ответ

1 голос
/ 28 мая 2020

Вот фрагмент кода, который делает то, что вы хотите:

  1. Когда окно создается изначально, кнопка выключена.
  2. При нажатии кнопки кнопка меняет состояние на «Вкл.».

Обратите внимание, что это минимальный пример, поэтому повторное нажатие на кнопку не изменит ее состояние обратно на «Вкл.», но я оставлю эту часть вам , если вам это необходимо.

#include <gtkmm.h>

int main(int argc, char *argv[])
{
    auto app = Gtk::Application::create(argc, argv, "buttons.on.off");

    // Load images:
    Gtk::Image button1_on_image{"button1_on.png"};
    Gtk::Image button1_off_image{"button1_off.png"};

    // Create button:
    Gtk::ToolButton button1{button1_off_image};
    button1.set_tooltip_markup("Select one stick");

    // Create handler (as a lambda):
    const auto handler = [&button1, &button1_on_image, &button1_off_image]()
                         {
                             // We change to "on" here (when clicked):
                             button1.set_icon_widget(button1_on_image);

                             // We make it visible:
                             button1.show_all();
                         };

    button1.signal_clicked().connect(handler);

    // Add the button to the window.
    Gtk::Window window;
    window.add(button1);

    // Make the window visible:
    window.show_all();

    return app->run(window);
}

Я сделал некоторые упрощения в вашем фрагменте:

  1. Элемент списка
  2. Я положил все в стек ( no new).
  3. Обработчик - лямбда.

На мой взгляд, это делает синтаксис более понятным.

...