Поиск:

Ответ в темуСоздание новой темы Создание опроса
> diagramscene из примеров Qt + itemChange, не получается ограничить перемещение 
V
    Опции темы
Vitaliynew
Дата 16.8.2011, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.9.2008

Репутация: нет
Всего: нет



Я пока новичок в Qt и некоторые вопросы просто вводят в ступор.
Необходимо осуществить ограничение перемещения объекта по оси Х. 
 
Берем проект diagramscene из примеров, поставляемый с Qt.
В diagramitem.срр находим функцию:
Код
QVariant DiagramItem::itemChange(GraphicsItemChange change,
                     const QVariant &value)
 
"ремим" все что в ней есть и согласно помощи Асистента вставляем:
Код

if (change == ItemPositionChange) {
             // value это новое положение.
             QPointF newPos = value.toPointF();
             newPos.setX(x()); // ограничиваем по Х
             QRectF rect = scene()->sceneRect();
             if (!rect.contains(newPos)) {
                 // Сохраняем элемент внутри прямоугольника сцены.
                 newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
                 newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
                 return newPos;
             }
         }
    return QGraphicsItem::itemChange(change, value);

однако ограничение перемещения по оси Х не происходит !!!??? 
PM MAIL   Вверх
bsa
Дата 16.8.2011, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Vitaliynew, думаю, что основная проблема заключается в том, что ты что-то делаешь только тогда, когда выходит за прямоугольную область. В противном случае изменения newPos просто не имеют смысла. Кстати, в строке 13 идет возврат value (хотя, в оригинале этого нет). Ты уверен, что QGraphicsItem::itemChange() ничего не делает?
PM   Вверх
Vitaliynew
Дата 16.8.2011, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.9.2008

Репутация: нет
Всего: нет



Честно говоря мне необходимо построить несколько графиков функций (вроде научился делать) и необходимо сделать их перемещаемыми по форме но при этом чтобы они не двигались по оси Х т.е. только вверх-вниз.   
Цитата

Ты уверен, что QGraphicsItem::itemChange() ничего не делает?

на одном из форумов по Qt, кому-то подсказывали что нужно использовать  QGraphicsItem::itemChange(), сам еще в это не въехал, пока образования маловато...
Был бы признателен за пример в котором одна линия и она двигается только вверх-вниз.  
PM MAIL   Вверх
bsa
Дата 16.8.2011, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Думаю, как-то так:
Код
if (change == ItemPositionChange) {
    // value это новое положение.
    QPointF newPos = value.toPointF();
    newPos.setX(x()); // ограничиваем по Х
    QRectF rect = scene()->sceneRect();
    if (!rect.contains(newPos)) {
         // Сохраняем элемент внутри прямоугольника сцены.
         newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
         newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
    }
    return newPos;
}
return QGraphicsItem::itemChange(change, value);

PM   Вверх
Vitaliynew
Дата 16.8.2011, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.9.2008

Репутация: нет
Всего: нет



bsa, спасибо Вам огромное заработало!
неужели в асистенте ошибка? У них 
Код

return newPos; 

находится внутри 
Код

if (!rect.contains(newPos)) {...}
 
?
PM MAIL   Вверх
bsa
Дата 17.8.2011, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(Vitaliynew @  16.8.2011,  20:35 Найти цитируемый пост)
неужели в асистенте ошибка?

нет там ошибки. просто там задача была другая - держать объект внутри области. И тот пример с ней с успехом справлялся.
PM   Вверх
Vitaliynew
Дата 17.8.2011, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.9.2008

Репутация: нет
Всего: нет



Еще раз спасибо, уже за пояснения.
Засунул код в проект diagramscene (стандартные примеры) работает наполовину, т.е. при создании, например, прямоугольника на сцене отображается только его правая половина. Наверное это как-то связано с отображением?
Как например заставить объект выводится со значением 200 по Х?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.