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

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

Страниц: 1 2 3 [4] 5 6   Вниз
  Печать  
Автор Тема: Ханойские башни  (Прочитано 38573 раз)
BlackTass
Гость
« Ответ #45 : Январь 24, 2010, 21:52 »

такого сигнала нет. Переопределяйте
Код:
void QGraphicsItem::dropEvent ( QGraphicsSceneDragDropEvent * event )   [virtual protected]
Записан
Nekron
Гость
« Ответ #46 : Январь 24, 2010, 22:17 »

хмм (
а примера простого нет? а то не совсем пойму как сделать  Строит глазки
Записан
BlackTass
Гость
« Ответ #47 : Январь 24, 2010, 22:25 »

Наследуетесь от нужного класса айтемов (видимо QGraphicsRectItem), там переопределяете этот метод, в нем пишите то что вам нужно (впринципе можно сделать свой сигнал и там его испускать). На сцену складываете экземпляры уже не QGraphicsRectItem, а своего класса.
Записан
Nekron
Гость
« Ответ #48 : Январь 24, 2010, 23:08 »

Сори всеравно не пойму как это сделать, я придумал другой способ
Создаю таймер
Код:
#include <QTimer>
QTimer *timer = new QTimer();

Код:
timer->start(1000);
        connect(timer, SIGNAL(timeout()), this, SLOT(Move()));

И далее в функции Move проверяю не колайдятсяли и запускаю таймер заново
Код:
void MainWindowImpl::Move()
{......
timer->start(1000);
}
Записан
Nekron
Гость
« Ответ #49 : Январь 24, 2010, 23:12 »

хмм... хотя не очень получается способ ( во время перетаскивания тоже работает и убирает от курсора.
Записан
Nekron
Гость
« Ответ #50 : Январь 24, 2010, 23:20 »

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

item[15]->isUnderMouse()  пока нашел, но не лучший вариант конечно, isActive и isSelected почему-то не действуют как я ожидаю от них, перетаскиваю я или нет на результат не влияет
« Последнее редактирование: Январь 24, 2010, 23:28 от Nekron » Записан
Nekron
Гость
« Ответ #51 : Январь 25, 2010, 01:02 »

хмм когда перетаскиваю на другую башню, то после проверки на колайд и назначения новых координат, появляется совсем не там где я ожидаю... оно даже зависит от того в каком месте на линии соприкасается., разве координаты задают не точное расположение объектов, а только смещение какоето?
Записан
BlackTass
Гость
« Ответ #52 : Январь 25, 2010, 02:37 »

Решение с таймером мягко говоря как путь из Москвы в Питер через Новосиб.
Код
C++ (Qt)
class MyGraphicsRectItem : public QGraphicsRectItem
{
   Q_OBJECT
signals:
   void itemDropped();
protected:
   void dropEvent (QGraphicsSceneDragDropEvent *event)
   {
       emit itemDropped();
   }
};
 
При добавлении айтемов на сцену вместо экземпляров QGraphicsRectItem кидаете экземпляры этого класса.
Коннектите к сигналу itemDropped слот, в котором уже проверяете на коллизии (чтобы получить объект который испустил сигнал вызовите sender() в слоте).

хмм когда перетаскиваю на другую башню, то после проверки на колайд и назначения новых координат, появляется совсем не там где я ожидаю... оно даже зависит от того в каком месте на линии соприкасается., разве координаты задают не точное расположение объектов, а только смещение какоето?
Опять же тут можно гадать веками что у вас не так.
Выложите минимально компилируемую версию, так будет проще.
Записан
Nekron
Гость
« Ответ #53 : Январь 25, 2010, 14:05 »

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

когда пытаюсь сделать это, делаю инклуд в h-нике(пытался и в мэйнвиндова и отдельно для майграфикректитема создавал)
Код:
#include <QGraphicsRectItem>
и код данный вами, но оно выдает ошибки (

build\moc_MyGraphicsRectItem.cpp:41: error: `staticMetaObject' is not a member of `QGraphicsRectItem'
build\moc_MyGraphicsRectItem.cpp: In member function `virtual void* MyGraphicsRectItem::qt_metacast(const char*)':
build\moc_MyGraphicsRectItem.cpp:55: error: `qt_metacast' is not a member of `QGraphicsRectItem'
build\moc_MyGraphicsRectItem.cpp: In member function `virtual int MyGraphicsRectItem::qt_metacall(QMetaObject::Call, int, void**)':
build\moc_MyGraphicsRectItem.cpp:60: error: `qt_metacall' is not a member of `QGraphicsRectItem'
build\moc_MyGraphicsRectItem.cpp: In member function `void MyGraphicsRectItem::itemDropped()':
build\moc_MyGraphicsRectItem.cpp:75: error: no matching function for call to `QMetaObject::activate(MyGraphicsRectItem* const, const QMetaObject*, int, int)'
../../../QtCreator/qt/include/QtCore/../../src/corelib/kernel/qobjectdefs.h:311: note: candidates are: static void QMetaObject::activate(QObject*, int, void**)
../../../QtCreator/qt/include/QtCore/../../src/corelib/kernel/qobjectdefs.h:312: note:                 static void QMetaObject::activate(QObject*, int, int, void**)
../../../QtCreator/qt/include/QtCore/../../src/corelib/kernel/qobjectdefs.h:313: note:                 static void QMetaObject::activate(QObject*, const QMetaObject*, int, void**)
../../../QtCreator/qt/include/QtCore/../../src/corelib/kernel/qobjectdefs.h:314: note:                 static void QMetaObject::activate(QObject*, const QMetaObject*, int, int, void**)
Записан
BlackTass
Гость
« Ответ #54 : Январь 25, 2010, 14:11 »

да, точно, совсем забыл что графикайтем не куобжект. Добавьте еще наследование от QObject'а.
Записан
Nekron
Гость
« Ответ #55 : Январь 25, 2010, 14:47 »

ммм можно еще подсказать насчет конекта?
Код:
connect(item[15],SIGNAL(itemDropped()),sender(),Move());

src\mainwindowimpl.cpp:41: error: invalid use of void expression

в чем ошибся?
Записан
BlackTass
Гость
« Ответ #56 : Январь 25, 2010, 14:50 »

Код:
connect(item[15],SIGNAL(itemDropped()),sender(),SLOT(Move()));
только я не понял зачем вы здесь сендер используете. Или это происходит в слоте, который связан с сигналом объекта у которого и есть данный метод Move() ?
Записан
Nekron
Гость
« Ответ #57 : Январь 25, 2010, 14:54 »

А со скобкой ошибся ( плохо без QT Creator-а а инет плохой здесь не скачать.

да нет, то я так пробовал думал может нужно так чтобы ошибки не было, вобщем конечный вариант такой?

Код:
		for(int i=1;i<16;i++){
        connect(item[i],SIGNAL(itemDropped()),this,SLOT(Move()));}
Записан
Nekron
Гость
« Ответ #58 : Январь 25, 2010, 15:17 »

хмм,
сделал так
Код:
connect(item[15],SIGNAL(itemDropped()),this,SLOT(Move()));

функция

Код:
void MainWindowImpl::Move()
{
item[13]->setRect(QRectF(-225.0+n1, 160.0, 190.0, 25.0));
}

и 13ый никак не реагирует

выкладываю исходник еще если что.
Записан
BlackTass
Гость
« Ответ #59 : Январь 25, 2010, 15:20 »

вечером гляну, если раньше никто не отпишется
Записан
Страниц: 1 2 3 [4] 5 6   Вверх
  Печать  
 
Перейти в:  


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