Я довольно новичок в QT и изо всех сил пытаюсь заставить работать базовый пример рисования. Я создаю игру, в которой я создаю экземпляр виджета в своем основном игровом контроллере. Я хочу передать это нескольким различным объектам, чтобы каждый объект мог иметь свой собственный paintEvent и соответственно рисовать свои объекты. (Т.е. персонаж будет рисовать отдельно, декорации и т. Д. И т. Д.)
Вот мой заголовок «анимированный объект»:
class Animated_object: public QWidget {
public:
Animated_object(char * _image_url, QWidget * window);
~Animated_object();
protected:
QImage * get_image();//this will return the image for this object
QRect * get_rectangle();//this will return the rectangle of coordinates for this pointprotected:
virtual void paintEvent(QPaintEvent * event) = 0;
virtual void set_image(char * _image_url) = 0;protected:
QWidget * window;
char * image_url;//this is the imageurl
QImage * image;
QRect * rectangle;
};
Мой конструктор анимированных объектов:
Animated_object::Animated_object(char * _image_url, QWidget * _window) : QWidget(_window) {....}
и вот мой заголовок персонажа (персонаж наследует от animated_object)
class Character : public Animated_object {
public:
Character(QWidget * _window);
~Character();
void operator()();//this is the operator for the character class -- this is responsible for running the character
void set_image(char * _image_url) {};
void paintEvent(QPaintEvent * event);
};
Я создаю экземпляр символа, передавая конструктору мой основной указатель виджета. Поэтому у меня есть другой класс, который может вызывать несколько символов, и все они будут рисовать в одном виджете (надеюсь).
Мой персонаж paintEvent выглядит так:
void Character::paintEvent(QPaintEvent * event) {
QPainter painter(this);//pass it in window to ensure that it is painting on the correct widget!
cout << "PAINT EVENT " << endl;
QFont font("Courier", 15, QFont::DemiBold);
QFontMetrics fm(font);
int textWidth = fm.width("Game Over");
painter.setFont(font);
painter.translate(QPoint(50, 50));
painter.drawText(10, 10, "Game Over");
}
Он вызывается (я использовал для проверки это std :: cout), но ничего не рисует …
Наконец, вот где мой главный виджет называется.
Hill_hopper::Hill_hopper(): Game(500,500, "Hill Hopper") {
Character * character = new Character(window);
window->show();
application->exec();}
А вот и игровой конструктор:
Game::Game(int _height, int _width, char * title): height(_height), width(_width) {int counter = 0;
char ** args;application = new QApplication(counter, args);
window = new QWidget();
desktop = QApplication::desktop();
this->set_parameters(title);
}
Любая помощь будет принята с благодарностью
Похоже, вам не хватает макроса Q_OBJECT в ваших заголовках. Хотя это может и не быть проблемой, если его все равно вызывают.
В любом случае, я предлагаю вам использовать Qt Creator для создания новых классов, он создаст для вас скелеты файлов .h и .cpp, избегая таких вещей, как этот.
Для быстро обновляющейся игры вам, вероятно, следует один виджет игровой зоны, где вы рисуете все движущиеся. Если вы рисуете только QPixMaps (без прямого текста или рисования линий, сначала превратите фрагменты текста в QPixmaps), то простое превращение виджета в QGLWidget сделает вращение и масштабирование «спрайтов» QPixMap очень быстрыми без необходимости писать какой-либо код OpenGL самостоятельно. Но если предложенный QGraphicsView достаточно быстрый, то он будет очень полезен, если вы будете работать с ним, сначала вы должны поэкспериментировать с этим.
Вы должны использовать QGraphicsView виджет, который предназначен для такого рода мысли. В сцене (QGraphicsScene) из QGraphicsView вы можете напрямую добавлять виджеты. Встроенная система будет управлять вашими виджетами и запускать событие рисования при необходимости.
Кроме того, у вас есть много полезных функций для поиска, перемещения и т. Д. Ваших виджетов.