Как заставить Gtk.Iconview реагировать на один клик, а не на двойной щелчок?

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

bash -c 'nautilus "/path/to/folder"'
6
задан 31 May 2012 в 02:40

27 ответов

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

Образец, который предполагает рабочий сигнал on_item_activated, будет:

def on_icon_view_selection_changed(self, widget):
        self.on_item_activated(widget, widget.get_selected_items()[0])
5
ответ дан 25 May 2018 в 10:47
  • 1
    Мне жаль, что я не могу дать дополнительные баллы за то, что вы вышли за рамки служебных обязанностей :) Спасибо за отправку ветки, которая на самом деле это исправляет. И для всех, кто интересуется деталями, проверьте наши версии от 85 до 87 на code.launchpad.net/~stefan-schwarzburg/qreator/… – David Planella 7 June 2012 в 23:38

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

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

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

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

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

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

предназначены для запуска действия (например, остановки, воспроизведения, паузы) или взаимодействия с программой (например, «ОК», «Отмена») или даже действия в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанных с ним (например, «Сэмми Дэвис младший» от «Movits!» Из альбома «Из головы»).

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

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

5
ответ дан 31 July 2018 в 11:19

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

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

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

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

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

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

предназначены для запуска действия (например, остановки, воспроизведения, паузы) или взаимодействия с программой (например, «ОК», «Отмена») или даже действия в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанных с ним (например, «Сэмми Дэвис младший» от «Movits!» Из альбома «Из головы»).

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

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

5
ответ дан 31 July 2018 в 12:19

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

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

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

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

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

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

предназначены для запуска действия (например, остановки, воспроизведения, паузы) или взаимодействия с программой (например, «ОК», «Отмена») или даже действия в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанных с ним (например, «Сэмми Дэвис младший» от «Movits!» Из альбома «Из головы»).

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

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

5
ответ дан 2 August 2018 в 00:51

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

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

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

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

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

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

предназначены для запуска действия (например, остановки, воспроизведения, паузы) или взаимодействия с программой (например, «ОК», «Отмена») или даже действия в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанных с ним (например, «Сэмми Дэвис младший» от «Movits!» Из альбома «Из головы»).

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

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

5
ответ дан 4 August 2018 в 16:22

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

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

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

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

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

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

предназначены для запуска действия (например, остановки, воспроизведения, паузы) или взаимодействия с программой (например, «ОК», «Отмена») или даже действия в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанных с ним (например, «Сэмми Дэвис младший» от «Movits!» Из альбома «Из головы»).

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

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

5
ответ дан 6 August 2018 в 01:01

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

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

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

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

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

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

предназначены для запуска действия (например, остановки, воспроизведения, паузы) или взаимодействия с программой (например, «ОК», «Отмена») или даже действия в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанных с ним (например, «Сэмми Дэвис младший» от «Movits!» Из альбома «Из головы»).

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

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

5
ответ дан 7 August 2018 в 18:27

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

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

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

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

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

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

предназначены для запуска действия (например, остановки, воспроизведения, паузы) или взаимодействия с программой (например, «ОК», «Отмена») или даже действия в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанных с ним (например, «Сэмми Дэвис младший» от «Movits!» Из альбома «Из головы»).

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

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

5
ответ дан 10 August 2018 в 07:09

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

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

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

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

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

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

предназначены для запуска действия (например, остановки, воспроизведения, паузы) или взаимодействия с программой (например, «ОК», «Отмена») или даже действия в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанных с ним (например, «Сэмми Дэвис младший» от «Movits!» Из альбома «Из головы»).

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

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

5
ответ дан 15 August 2018 в 19:08
  • 1
    В самом деле, я, кажется, нажимаю некоторые ограничения инструментария :-) Я действительно люблю GTK, но в последнее время я трачу больше времени на это, чем на фактическое кодирование функций приложения. Я исследовал использование сетки с кнопками до того, как я выбрал Iconview, но я отбросил ее в пользу встроенных функций для отображения значков и их описаний и, самое главное, для интеграции с ассоциированным Gtk.ListStore, который я использую для хранения метаданных. – David Planella 31 May 2012 в 13:26
  • 2
    Я смотрю диалоговое окно системных настроек (Центр управления GNOME) и, похоже, использует один клик для представления, похожего на IconView. Я очень хочу исследовать, что они используют позже. – David Planella 31 May 2012 в 13:26
  • 3
    @DavidPlanella добавила ветку с сеткой кнопок. Вы можете попробовать и посмотреть, нравится ли вам ... – xubuntix 1 June 2012 в 22:28
  • 4
    Спасибо! Я получил уведомление и увидел предложение о слиянии, это потрясающе. Я только что просмотрел один, и я сделаю это в течение выходных. Давайте продолжим обсуждение предложения о слиянии – David Planella 2 June 2012 в 03:19
  • 5
    Мне жаль, что я не могу дать дополнительные баллы за то, что вы вышли за рамки служебных обязанностей :) Спасибо за отправку ветки, которая на самом деле это исправляет. И для всех, кто интересуется деталями, проверьте наши версии с 85 по 87 на code.launchpad.net/~stefan-schwarzburg/qreator/… – David Planella 7 June 2012 в 23:38

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

Образец, который предполагает рабочий сигнал on_item_activated, будет:

def on_icon_view_selection_changed(self, widget):
        self.on_item_activated(widget, widget.get_selected_items()[0])
5
ответ дан 18 August 2018 в 21:56
  • 1
    Мне жаль, что я не могу дать дополнительные баллы за то, что вы вышли за рамки служебных обязанностей :) Спасибо за отправку ветки, которая на самом деле это исправляет. И для всех, кто интересуется деталями, проверьте наши версии с 85 по 87 на code.launchpad.net/~stefan-schwarzburg/qreator/… – David Planella 7 June 2012 в 23:38

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

2
ответ дан 25 May 2018 в 10:47
  • 1
    Хорошо, спасибо @dobey. Поэтому, я думаю, я могу оставить парящую часть, но, глядя на единственный клик и button-press-event, я не уверен, что смогу использовать это. Если я правильно ее понимаю, проблема в том, что, когда я нажимаю на значок и перехватывает button-press-event, я не буду знать, какой из них он есть, поскольку идентификатор элемента базовой модели не будет передан в обратном вызове, как это делается для обратного вызова on_iconview1_view_item_activated, который я использую прямо сейчас. – David Planella 31 May 2012 в 16:08
  • 2
    Правильно. Вам также придется использовать API для запроса IconView, чтобы получить ячейку, по которой произошел щелчок мыши. Сигнал нажатия кнопки - это общий сигнал от GtkWidget, что большинство всех (интерактивных / фокусных) виджетов будут издавать, когда вы нажимаете на них кнопку мыши. Вам придется выполнить всю сложную работу вручную, которую активирует код в GTK + уже для двойного щелчка, но делайте это за один клик и вручную избегайте условий двойного клика в вашем коде. – dobey 31 May 2012 в 16:32
  • 3
    Любые указания относительно того, как я могу использовать API для запроса IconView для получения ячейки, по которой произошел щелчок мыши? Я думаю, что если я смогу это понять, это поможет мне оценить, стоит ли работать на ручную работу, или если я просто буду жить с двойным щелчком :) – David Planella 31 May 2012 в 23:47
  • 4
    developer.gnome.org/gtk3/stable/… Это даст вам GtkTreePath, который вы можете использовать для получения итератора из модели на представлении, а затем оттуда, то же самое, что и вы выполняете обратный вызов для активированного элементом сигнала. – dobey 1 June 2012 в 01:19

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

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

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

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

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

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

предназначены для запуска действия (например, остановки, воспроизведения, паузы) или связи с программой (например, «ОК», «Отмена») или даже действия в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанных с ним (например, «Сэмми Дэвис младший» от «Movits!» Из альбома «Из головы»).

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

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

1
ответ дан 25 May 2018 в 10:47
  • 1
    В самом деле, я, кажется, нажимаю некоторые ограничения инструментария :-) Я действительно люблю GTK, но в последнее время я трачу больше времени на это, чем на фактическое кодирование функций приложения. Я исследовал использование сетки с кнопками до того, как я выбрал Iconview, но я отбросил ее в пользу встроенных функций для отображения значков и их описаний и, самое главное, для интеграции с ассоциированным Gtk.ListStore, который я использую для хранения метаданных. – David Planella 31 May 2012 в 13:26
  • 2
    Я смотрю диалоговое окно системных настроек (Центр управления GNOME) и, похоже, использует один клик для представления, похожего на IconView. Я очень хочу исследовать, что они используют позже. – David Planella 31 May 2012 в 13:26
  • 3
    @DavidPlanella добавила ветку с сеткой кнопок. Вы можете попробовать и посмотреть, нравится ли вам ... – xubuntix 1 June 2012 в 22:28
  • 4
    Благодаря! Я получил уведомление и увидел предложение о слиянии, это потрясающе. Я только что просмотрел один, и я сделаю это в течение выходных. Давайте продолжим обсуждение предложения о слиянии – David Planella 2 June 2012 в 03:19

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

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

...
    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)
1
ответ дан 25 May 2018 в 10:47

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

2
ответ дан 25 July 2018 в 18:42

Вот как я заставил свой 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)
1
ответ дан 25 July 2018 в 18:42

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

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

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

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

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

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

предназначены для запуска действия (например, остановки, воспроизведения, паузы) или взаимодействия с программой (например, «ОК», «Отмена») или даже действия в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанных с ним (например, «Сэмми Дэвис младший» от «Movits!» Из альбома «Из головы»).

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

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

1
ответ дан 25 July 2018 в 18:42

Вот как я заставил свой 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)
1
ответ дан 31 July 2018 в 12:19

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

2
ответ дан 2 August 2018 в 00:51

Вот как я заставил свой 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)
1
ответ дан 2 August 2018 в 00:51

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

2
ответ дан 4 August 2018 в 16:22

Вот как я заставил свой 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)
1
ответ дан 4 August 2018 в 16:22

Вот как я заставил свой 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)
1
ответ дан 6 August 2018 в 01:01

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

2
ответ дан 7 August 2018 в 18:27

Вот как я заставил свой 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)
1
ответ дан 7 August 2018 в 18:27

Вот как я заставил свой 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)
1
ответ дан 10 August 2018 в 07:09

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

2
ответ дан 15 August 2018 в 19:08
  • 1
    Хорошо, спасибо @dobey. Поэтому, я думаю, я могу оставить парящую часть, но, глядя на единственный клик и button-press-event, я не уверен, что смогу использовать это. Если я правильно ее понимаю, проблема в том, что, когда я нажимаю на значок и перехватывает button-press-event, я не буду знать, какой из них он есть, поскольку идентификатор элемента базовой модели не будет передан в обратном вызове, как это делается для обратного вызова on_iconview1_view_item_activated, который я использую прямо сейчас. – David Planella 31 May 2012 в 16:08
  • 2
    Правильно. Вам также придется использовать API для запроса IconView, чтобы получить ячейку, по которой произошел щелчок мыши. Сигнал нажатия кнопки - это общий сигнал от GtkWidget, что большинство всех (интерактивных / фокусных) виджетов будут издавать, когда вы нажимаете на них кнопку мыши. Вам придется выполнить всю сложную работу вручную, которую активирует код в GTK + уже для двойного щелчка, но делайте это за один клик и вручную избегайте условий двойного клика в вашем коде. – dobey 31 May 2012 в 16:32
  • 3
    Любые указания относительно того, как я могу использовать API для запроса IconView для получения ячейки, по которой произошел щелчок мыши? Я думаю, что если я смогу это понять, это поможет мне оценить, стоит ли работать на ручную работу, или если я просто буду жить с двойным щелчком :) – David Planella 31 May 2012 в 23:47
  • 4
    developer.gnome.org/gtk3/stable/… Это даст вам GtkTreePath, который вы можете использовать для получения итератора из модели на представлении, а затем оттуда, то же самое, что и вы выполняете обратный вызов для активированного элементом сигнала. – dobey 1 June 2012 в 01:19

Вот как я заставил свой 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)
1
ответ дан 15 August 2018 в 19:08

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

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