2015-03-25 4 views
0

Я изменяю пример Qt' collidingmice ', который поставляется с кодом Qt.
В исходном источнике QApplication содержит QView и QScene, но я создал класс CollidingMice, содержащий QView и QScene, чтобы убить представление и сцену с помощью ввода с клавиатуры. Я хочу отправить входной сигнал клавиатуры в класс CollidingMice. Я прочитал 4 или 5 вопросов в переполнении стека о «неопределенной ссылке на vtable for ..», но не смог найти подходящий мне случай. Я проверил, что
1. В родительских классах нет виртуальной функции, которая не определена.
2. Я попытался добавить определение деструктора ~ CollidingMices() {}
3. И я на 99% уверен, что в коде CollidingMice ниже нет неопределенной функции-члена.просмотр неопределенной ссылки на `vtable for CollidingMice '

#include "mouse.h" 

#include <QtGui> 


#include <math.h> 

static const int MouseCount = 7; 
class CollidingMice : public QMainWindow 
{ 
     Q_OBJECT 

     private: 
       QGraphicsView *view; 
       QGraphicsScene scene; 
       QTimer *timer; 

     public: 
       CollidingMice(QWidget *parent = 0): QMainWindow(parent) { 
         scene.setSceneRect(-300, -300, 600, 600); 
         scene.setItemIndexMethod(QGraphicsScene::NoIndex); 
         for (int i = 0; i < MouseCount; ++i) { 
           Mouse *mouse = new Mouse; 
           mouse->setPos(::sin((i * 6.28)/MouseCount) * 200, 
               ::cos((i * 6.28)/MouseCount) * 200); 
           scene.addItem(mouse); 
         } 
         view = new QGraphicsView(this); 
         view->setRenderHint(QPainter::Antialiasing); 
         view->setBackgroundBrush(QPixmap(":/images/cheese.jpg")); 
         view->setCacheMode(QGraphicsView::CacheBackground); 
         view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); 
         view->setDragMode(QGraphicsView::ScrollHandDrag); 
         view->setWindowTitle(QT_TRANSLATE_NOOP(QGraphicsView, "Colliding Mice")); 
#if defined(Q_WS_S60) || defined(Q_WS_MAEMO_5) || defined(Q_WS_SIMULATOR) 
         view->showMaximized(); 
#else 
         view->resize(600, 450); 
         view->move(30,30); 
         view->show(); 
#endif 
         timer = new QTimer; 
         QObject::connect(timer, SIGNAL(timeout()), &scene, SLOT(advance())); 
         timer->start(1000/33); 
       } 

     private: 
       void keyPressEvent(QKeyEvent *event); 
}; 

void CollidingMice::keyPressEvent(QKeyEvent *event) 
{ 
       if (event->key() == Qt::Key_q) { 
           close(); 
       } 
} 

int collidingmice_main(int argc, char **argv) 
{ 
       QApplication app(argc, argv); 
       qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); 

       CollidingMice w; 

       return app.exec(); 
} 

ADD и EDIT: После удаления QObject выше, как svlasov сказал мне, и после фиксации конструктора, как показано ниже (см setScene..my Colleage предложил мне.)

   view = new QGraphicsView(this); 
       view->resize(600,500); 
       view->setScene(&scene); 
       view->setRenderHint(QPainter::Antialiasing); 

я мог скомпилировать его и выполнить.

enter image description here

ответ

2

Если вы используете Q_OBJECT в определении класса, вы должны извлечь класс в отдельный файл заголовка.

Если вы не объявляете сигналы и слоты в классе CollidingMice, просто удалите Q_OBJECT и он скомпилирует.

UPDATE

Как прокомментировал @KubaOber, вы можете просто включить в конец файла file.cpp:

#include "file.moc" 

qmake и будет делать всю работу.

+0

О, что сделали это компилируется! Благодарю. –

+0

BTW, я не вижу вид встречной мысли. Можете ли вы сказать мне, что случилось? Я когда-то видел, что мой предыдущий код (который я удалил по ошибке) написал таким образом, по крайней мере, показал движущихся мышей. –

+0

Вам нужно показать его 'w.show();'. – svlasov

1

Кажется, что ваш класс объявлен в .cpp, а не .h

Qt MOC не нравится. Вы можете добавить #include "mysrcfile_moc.cpp" в конце файла или переместить объявление класса в mysrcfile.h. Не забудьте очистить после этого &.

1

Есть 3 проблемы с вашим кодом ...

  1. Qt разбирает заголовок класса и конструкции, лежащие в основе функции, относящиеся к иерархии QObject, в том числе символов для экспорта. Это рудиментарный парсер и нуждается в явном файле заголовка - как для удобства анализа, так и для экспорта символов. Создайте заголовок - поверьте мне, это 5 секунд работы по созданию файла, вырезать вставить объявление класса и включить его обратно ... и экономит много времени на устранение неполадок Qt-компиляции.

  2. Сцена имеет прямоугольник сцены, но представление является обычным QWidget - это означает, что Window должен использовать класс макета и включать его как в другие QWidgets. В противном случае представление будет иметь размер как-то вроде QSize (1,1) и находится по умолчанию (0, 0). Вот почему вы не можете это увидеть.

  3. Для QGraphicsScene, что вы ищете слот update() и не advance()

+0

ОК, по крайней мере, он компилируется сейчас, но после его изменения на 'view = new GraphicsView (& scene);' размер окна в норме меньше изображений с мышами и сыром. Через секунду я выложу новый захват. –

 Смежные вопросы

  • Нет связанных вопросов^_^