Рисование другого изображения для двух объектов одного класса - PullRequest
0 голосов
/ 28 августа 2011

У меня есть два объекта, whitepawn и blackpawn типа Piece.Все в этих двух объектах одинаково, за исключением использованного изображения.В настоящее время этот код я использую для рисования белой пешки:

void Pawn::paintEvent(QPaintEvent *)
{
    pixmap.load(":/whitepawn.png");

    QPainter paint(this);
    paint.drawPixmap(x, y, pixmap);
}

Есть ли способ использовать другое изображение для черной пешки с созданием нового класса и переопределением функции paintEvent нового класса?

Редактировать: старый заголовок был для другого вопроса, игнорируйте его, если вы его видели.

Ответы [ 2 ]

4 голосов
/ 28 августа 2011

Конечно, вы можете

class Pawn {
    public:
    virtual char const* imageFileName() = 0;
};

Извините, в прошлый раз я скупился на объяснение и выглядело так, как будто не было лишних классов, действительно должно быть:

class WhitePawn : public Pawn {
    public:
    virtual char const* imageFileName();
};

Затем переопределите (+ объявление):

char const* WhitePawn::imageFileName() { return "./whitepawn.png"; }

char const* BlackPawn::imageFilename() { return "./blackpawn.png"; }

и позвоните imageFilename() из paintEvent():

void Pawn::paintEvent(QPaintEvent *)
{
    pixmap.load(imageFilename());

    QPainter paint(this);
    paint.drawPixmap(x, y, pixmap);
}

Но мне лично нравится идея Керрека сделать этопеременная.Вы даже можете сделать это без дополнительных занятий:

class Pawn {
    public:
    Pawn(char const *filename) : filename(filename) { }

    private:
    char const *filname;
};

Pawn whitePawn("./whitepawn.png");
2 голосов
/ 28 августа 2011

Виртуальные функции являются стандартным решением здесь:

class Pawn
{
  virtual void paintEvent(QPaintEvent *) { }
  // ...
};

class WhitePawn : public Pawn
{
  virtual voidpaintEvent(QPaintEvent *)
  {
    pixmap.load(":/whitepawn.png");
    QPainter paint(this);
    paint.drawPixmap(x, y, pixmap);
  }
};

// similar for class BlackPawn

Теперь вы можете позвонить Pawn * p = new BlackPawn; p->paintEvent(e); и получить правильную функцию. (Здесь термин «переопределение», а не «перегрузка», что является чем-то другим.)


Редактировать: видя хороший ответ Оуэна, еще одна идея, которая требует изменения конструкторов, - сделать имя файла переменной-членом:

class Pawn
{
  public: Pawn(const std::string & filename = "") : m_filename(filename) { }
  void paintEvent(QPaintEvent *)
  {
    if (m_filename == "") return;

    pixmap.load(m_filename);
    QPainter paint(this);
    paint.drawPixmap(x, y, pixmap);
  }
  // ...
  private: std::string m_filename;
};

class BlackPawn : public Pawn
{
  public: BlackPawn() : Pawn(":/blackpawn.png") { }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...