Russian Qt Forum
Ноябрь 22, 2024, 13:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Неудобное поведение сигнала selectionChanged в QGraphicsView  (Прочитано 12234 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #15 : Ноябрь 09, 2016, 14:59 »

Зачем?

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

для примера можно взять файловый менеджер konquerro или nautilus - там сразу по клику выделение (с зажатым ctrl)

Зачем вам СИГНАЛ О КЛИКЕ МЫШИ С НАЖАТЫМ Ctrl? Qt имеет полный готовый механизм для выделения айтемов на сцене, даже с резиновым квадратом. Его просто надо использовать. Всё, чего в нём не хватает - это подсветка выделенных айтемов, поскольку Qt элементарно не знает, как их надо подсвечивать. Поэтому в paintEvent() класса, наследующего от QGraphicsItem, надо просто добавить

if( isSelected() )
{
....подсветить айтем тем способом, который нужен...
}

Всё. QGraphicsScene::selectedItems() даёт список выбранных айтемов. Причём он содержит указатель на один текущий айтем, если на нём был клик мышкой даже без нажатия Ctrl - поскольку при операции с одним айтемом он также является выбранным. Механизм сделан так, что нет необходимости оформлять код отдельно для единственного выбранного айтема, и отдельно для группы. Просто ВСЕГДА работаете с группой айтемов, все свои операции делаете для группы. А один там айтем будет или несколько - это уже Qt обеспечивает.

Фишка в том, что механизм этот универсальный и мультиплатформенный - в Windows и Linux он позволяет выделять так, как принято в этих ОС, а в MacOSX по-своему. И более того - в Android он тоже по-своему будет работать, но привычно для пользователей Android.
« Последнее редактирование: Ноябрь 09, 2016, 15:02 от Гурман » Записан

2^7-1 == 127, задумайтесь...
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #16 : Ноябрь 09, 2016, 16:16 »

Вам так важны миллисекунды?

вообще и мне неудобно как сейчас есть (да миллисекунды решают)
а также это будет неудобно пользователям, которым придется объяснять что мышь не нужно дергать во время нажатия и отпускания для выделения
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #17 : Ноябрь 09, 2016, 16:18 »

Зачем вам СИГНАЛ О КЛИКЕ МЫШИ С НАЖАТЫМ Ctrl?

да ненужен мне сигнал о клике мышой сам по себе
мне нужен тут сигнал что элемент выделился (на клик мыши)

с подсветкой проблем нет, она имеется, и появляется когда сигнал "выделился" прилетает
я про подсветку вообще не упоминал о проблемах с ней

Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #18 : Ноябрь 09, 2016, 18:11 »

мне нужен тут сигнал что элемент выделился (на клик мыши)

ЗАЧЕМ?

И почему именно на клик мыши? Идеология работы с выделенными объектами не делает различий между способами выделения. Выделение резиновым квадратом логически точно то же самое, что и клик мыши.

Я недавно делал сложную работу на QGraphicsScene, и мне не понадобился сигнал о том, что объект выделился. Хотя в принципе его легко можно самому соорудить.

Насколько я помню, в paintEvent() можно испускать сигналы. Тогда в описании класса

Код:
private:
bool wasSelected;

public:
signals:
    void selected();
    void unselected();

в конструкторе

Код:
    wasSelected = false;

в paintEvent()

Код:
if( isSelected() )
{
    if( ! wasSelected )
    {
         emit selected();
         wasSelected = true;
    }
}
else
{
    if( wasSelected )
   {
        emit unselected();
        wasselected = false;
    }
}
Записан

2^7-1 == 127, задумайтесь...
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #19 : Ноябрь 09, 2016, 19:51 »

ЗАЧЕМ?
И почему именно на клик мыши? Идеология работы с выделенными объектами не делает различий между способами выделения. Выделение резиновым квадратом логически точно то же самое, что и клик мыши.

в который раз пытаюсь объяснить что НЕУДОБНО по отпусканию мыши выделение иметь, ибо она НЕ_ВЫДЕЛЯЕТ ничего если мышь сдвинулась - что тут непонятного ?
нет выделения при сдвиге мыши, нет и сигнала, ничего нет

вот как сделано выделение в konqueror или nautilus -  вот так удобно !
там и по клику выделение и "квадрат" тоже есть
самому костылики на эвентах пилить не хотелось, думал чтото гдето в настройках есть, что я не нашел

Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #20 : Ноябрь 09, 2016, 20:53 »

Честно говоря, не понимаю, что тут неудобного... сейчас запустил своё приложение, лишний раз пожмакал - всё удобно работает, выделяется да, по отпусканию. Нормально, никаких проблем не вызывает. Если выделять с зажатым Ctrl группу, и на последнем не отпускать, а сразу потащить - то выделяется (и у меня тащится) вся группа вместе с тем айтемом, на котором было последнее только нажатие.

По отсылкам на konqueror или nautilus вопрос возник - YALFM что-ли ваяете?
« Последнее редактирование: Ноябрь 09, 2016, 21:02 от Гурман » Записан

2^7-1 == 127, задумайтесь...
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #21 : Ноябрь 10, 2016, 15:48 »

Нормально, никаких проблем не вызывает.

ну так тему я создал, что неудобно мне )

По отсылкам на konqueror или nautilus вопрос возник - YALFM что-ли ваяете?

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

Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.