LINUX.ORG.RU

Синтаксическая ошибка с QTimer


0

1

Имеется класс MyGraphicsItem наследник QGraphicsItem. слот move() этого класса заставляет его изменяться по некоторому закону и нужно устроить переодический вызов move().

int main (int argc, char** argv) {
   QApplication qapp (argc, argv);
   QGraphicsScene scene(QRectF(-100,-50,200,200));
   MyGraphicsItem  myItem;
   scene.addItem(&myItem);
   QGraphicsView view(&scene);
   view.show();
   QTimer timer;
   QObject::connect(&timer, SIGNAL(timeout()), &myItem, SLOT(move())    );
   timer.start(1000);
   return qapp.exec ();
}

попытка компиляции приводит к ошибке

 error: no matching function for call to ‘QObject::connect(QTimer*, const char [11], MyGraphicsItem*, const char [8])’
/usr/include/qt4/QtCore/qobject.h:198:17: note: candidates are: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/include/qt4/QtCore/qobject.h:313:13: note:                 bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
make: *** [main.o] Ошибка 1

как устранить ошибку?

Ответ на: комментарий от VoofT

да здесь есть проблема.

если пишу так то куча ошибок

class MyGraphicsItem : public QGraphicsRectItem {
Q_OBJECT
...

если Q_OBJECT удалю то собирается но без QTimer.

nindza ()
Ответ на: комментарий от frozenix

No, it's not the only way. You can have a separate controller object that will emit signals on behalf of your items. Then you don't have to modify the item classes and they will remain to be light as you'll only have one object that emits signals for all your items.


Моя цель сделать свой класс элемент сцены со слотом выполняющим элементарное перемещение моего элемента сцены move(). Я правильно понимаю, что я должен в этом классе не писать слот move() а написать метод move(). А для того, чтобы сделать слот создать наследника от QObject и мой класс элемент сцены сделать полем? тогда на сцену добавлять не объект класса наследника QObject, а ссылку на объект класса элемента сцены?

нет что-то не так ...

nindza ()

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

Kosyak ★★★★ ()
Ответ на: комментарий от frozenix

Я планировал в слоты MyGraphicsItem поместить методы изменения его внешнего вида и логику выполнения элементарных перемещений.

Так понимаю наиболее рациональная организация: сделать методы (не слоты) и слоты выполнять в виджете наследнике от QObject со сценой ?

nindza ()
Ответ на: комментарий от nindza

Нашел пример «Сокобан» http://symmetrica.net/qt4/qt4-4a.tar.gz (http://symmetrica.net/qt4/lesson4.htm).

Вопрос: правильно ли я понимаю, что единственная рациональная возможность использовать таймер связана со внедрением слотов в класс MyForm (который достаточно унаследовать от QWidget, QMainWindow не нужен в этом примере) ?

в MyScene таймер не вставишь , т.к.

MvScene::MvScene(QObject *parent) : QGraphicsScene(parent)
?

ну и лучше делать три класса MyItem, MyScene, MyWidget ?

nindza ()
Ответ на: комментарий от anonymous

у же ж говорили

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

frozenix ★★★ ()
Ответ на: комментарий от nindza

запусти qmake после этого, чтобы moc файлы генерились

TERRANZ ★★★★ ()
Ответ на: комментарий от frozenix

Спасибо, CollidingMice помог!

Непонятен момент, как одним объектам разрешить движение, другим нет?

в примере повлиять можно на speed, но, наверное, лучше было бы обнулять параметр step, только как?

nindza ()
Ответ на: комментарий от nindza

самый простой вариант: создать наследника QGraphicsItem и добавить поле QPoint vec которые содержат направление движения. Например QPoint(0, 0) - стоять, QPoint(1, 0) - идти вправо

frozenix ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.