GTK — Не выделять кнопки при выборе / наведении

#ruby #linux #ubuntu #gtk #gnome

#ruby #linux #ubuntu #gtk #gnome

Вопрос:

Я пытаюсь написать графический интерфейс киоска на ruby / gtk в Ubuntu. Я довольно свободно говорю на ruby, но новичок в написании графических интерфейсов и не силен в Linux.

Я использую сенсорный экран и использую наши собственные изображения для кнопок, например

 button_image = Gtk::Image.new(Gdk::Pixbuff.new "images/button_image.png")
@button = Gtk::Button.new 
@button.add(button_image)
@button.set_relief(Gtk::RELIEF_NONE)
  

Моя проблема в том, что когда кнопки нажаты или остаются выбранными (или наведены на них, хотя для сенсорного экрана это менее актуально), gtk показывает жирные квадратные границы вокруг них. Очевидно, что к кнопкам применяется предварительное / выбранное / активное освещение gtk. Я пробовал изменять свойства кнопок различными способами, а также пытался взломать мою тему, и хотя я могу изменить внешний вид подсветки, я, похоже, не могу полностью избавиться от нее. Изменить цвет подсветки с помощью моей темы легко, но если я удалю свою настройку, по-прежнему останется значение по умолчанию, от которого я не смогу избавиться.

Кто-нибудь знает, есть ли способ остановить это или, возможно, сделать это прозрачным? Заранее спасибо!

Ответ №1:

Похоже, вы хотите использовать именно ваше изображение для всей кнопки, вместо того, чтобы помещать изображение внутрь обычной GtkButton, но при этом использовать все обычное поведение кнопки.

Самый простой способ сделать это — просто переопределить чертеж. Если вы используете gtk2, подключитесь к сигналу «expose-event», выполните там отрисовку и верните true, чтобы не запускался обработчик по умолчанию. Если вы используете gtk3, подключитесь к сигналу «рисовать» и проделайте то же самое.

Комментарии:

1. о, интересно — раньше я не углублялся в это, но я попробую, спасибо за предложение

Ответ №2:

Я попытался вмешаться в чертеж, как предложил Федерико, но обнаружил, что самый прямой способ решить эту проблему — вместо кнопки использовать окно события. Поля событий принимают нажатия точно так же, как кнопки, но не реагируют на выбор, наведение курсора и т.д. В ruby код выглядит следующим образом:

 image = Gtk::Image.new("myfile.png")
event_box = Gtk::EventBox.new.add(image)
event_box.visible_window = false
event_box.signal_connect("button_press_event") do
  puts "Clicked."
end
  

Большая часть этого в точности похожа на кнопку; очевидно, что метод * visible_window * скрывает окно события под изображением кнопки.