Как сделать Gtk. Iconview реагируют на одиночное нажатие вместо двойного щелчка?

Я использую Gtk. Виджет IconView в моем приложении для выбора различных типов элементов. Путем IconView работает, следующее:

  • Сделайте один щелчок для выбора объекта
  • Сделайте дополнительный двойной щелчок для активации объекта

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

Идеально, я хотел бы, чтобы IconView вел себя следующим образом:

  • Парение для выбора объекта (дополнительно)
  • Одиночное нажатие активирует объект

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

Gtk.IconView in action

6
задан 31 May 2012 в 01:40

4 ответа

Одно из решений (но только для активации одним щелчком) имеет смысл использовать сигнал selection_changed IconView (поскольку выбор IconView основан на одном щелчке).

Пример, предполагающий рабочий сигнал on_item_activation:

def on_icon_view_selection_changed(self, widget):
        self.on_item_activated(widget, widget.get_selected_items()[0])
0
ответ дан 31 May 2012 в 01:40

GtkIconView - это не расположение виджетов кнопок в таблице. По сути, это особый случай GtkTreeView, элементы которого расположены в виде сетки, а не списка / дерева. Я думаю, что для выделения элементов при наведении курсора требуется GTK +. Также потребуется исправление для добавления API, чтобы активировать один щелчок или двойной щелчок, однако эту функцию можно реализовать поверх существующего API виджета, прослушивая сигнал button_press_event на виджете, действуя соответственно.

0
ответ дан 31 May 2012 в 01:40

Вы, кажется, в последнее время изучаете ограничения Gtk: -)

Прежде всего, ответ добейса кажется правильным.

Tree- и List-Stores - хороший выбор для коллекций. Большие объемы данных, которые идентичны по типу, но различаются по мета-контенту (например, музыкальная коллекция, где каждая пьеса имеет исполнителя, альбом, название, но фактическое имя исполнителя, название альбома, название заголовка изменяется).

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

Изменение поведения TreeView или ListView в отношении щелчков / наведения и т. Д. На уровне для приложения является плохой идеей, потому что это портит то, как пользователи ожидают вашего приложение вести себя. Вы сами это выяснили, основываясь на реакции, которую вы описали в своем вопросе.

Ваша проблема, однако, в том, что пользователи не поняли, что ваш виджет является TreeView / ListView, вместо этого они подумали, что это несколько кнопок. И это, кажется, имеет смысл, основываясь на вашем скриншоте.

Кнопки предназначены для запуска действия (например, остановки, воспроизведения, паузы) или для связи с программой (например, «ОК», «Отмена») или даже в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанного с ним (например, «Sammy Davis Jr» от «Movits!» Из альбома «Out of my head»).

Итак, хотя неконфигурируемое поведение кликов является недостатком gtk, оно должно быть в любом случае только на глобальном уровне для каждого пользователя.

То, что вам нужно, это, вероятно, сетка с кнопками . (Кнопки также могут содержать значки).

0
ответ дан 31 May 2012 в 01:40

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

Вы должны активировать указатель-движение-уведомление для виджета, а затем преобразовать x, y-позицию указателя в путь вида иконки:

...
    self.iconview.add_events(Gdk.EventMask.POINTER_MOTION_MASK)
    self.iconview.connect("item-activated", self.iv_icon_activated)
    self.iconview.connect("button-press-event", self.on_mouse_click)
    self.iconview.connect("motion-notify-event", self.on_pointer_motion)

def on_pointer_motion(self, widget, event):
    path= self.iconview.get_path_at_pos(event.x, event.y)
    if path !=None:
            self.iconview.select_path(path)
    #If we're outside of an item, deselect all items (turn off highlighting)
    if path == None:
        self.iconview.unselect_all()

def on_mouse_click(self,widget, event):
    if event.type == Gdk.EventType.BUTTON_PRESS:
        path=self.iconview.get_selected_items()[0]
       #if right click activate a pop-up menu
        if event.button == 3 and path != None:
            self.popup.popup(None, None, None, None, event.button, event.time)
       #if left click, activate the item to execute
        if event.button == 1 and path != None:
            self.iv_icon_activated(widget, path)
0
ответ дан 31 May 2012 в 01:40

Другие вопросы по тегам:

Похожие вопросы: