проблема с рисованием одного виджета внутри другого (родительский) - PullRequest
3 голосов
/ 11 декабря 2010

Я пытаюсь сделать простую игру под Qt 4.6. Идея состоит в том, чтобы иметь два виджета, один - виджет главного окна и представляет пространство, а второй - виджет звездолета внутри пространства (родитель). Упрощенный код выглядит так:

/*this is ship and child widget*/
class MyRect : public QWidget {

Q_OBJECT

public:
MyRect(QWidget* parent)
    : QWidget(parent)
{
    itsParent = parent;

    itsx = 120;
    itsy = 250;
    itsw = 110;
    itsh = 35;
    body = new QRect(itsx, itsy, itsw, itsh);

}

~MyRect() {}


protected:
    void paintEvent(QPaintEvent *event);

private:
int itsx;
int itsy;
int itsw;
int itsh;
QRect* body;
QWidget* itsParent;

};


void MyRect::paintEvent(QPaintEvent *event)
{

  QPen pen(Qt::black, 2, Qt::SolidLine);
  QColor hourColor(0, 255, 0);


  QPainter painter(itsParent);

  painter.setBrush(hourColor);  
  painter.setPen(pen);
  painter.drawRect(*body);

}


/*this is space and main window widget*/
class space : public QMainWindow
{
  Q_OBJECT

public:
    space(QWidget *parent = 0);
   ~space();

protected:


private:
   MyRect* ship;

};

space::space(QWidget *parent)
 : QMainWindow(parent)
{
   ship = new MyRect(this);
}

Когда я компилирую, экран пуст и прямоугольник MyRect::body не рисуется. Я проверил онлайн-документацию по Qt и безуспешно провел исследование в Google. Любые объяснения по этому поводу приветствуются. Я хочу нарисовать один виджет на другом (родительском).

1 Ответ

3 голосов
/ 12 декабря 2010

QPainter painter(itsParent); - неправильно.Вы должны рисовать только на поверхности этого виджета, а не на родителях.Поэтому правильным будет QPainter painter(this);
• Вы должны не сохранять тело виджета в классе MyRect.Пространство класса должно сохранять свои размеры и положение.Таким образом, в MyRect::paintEvent() измените painter.drawRect(*body); на painter.drawRect( rect() );
• Поэтому в классе MyRect не должно быть ни одного члена.
• Последнее осталось: в space::space() add
ship->move( 120, 250 );
ship->resize( 110, 35 );
QPalette pal = palette();
pal.setColor( QPalette::Background, Qt::black ); // space is black, isn't it?
setPalette( pal );
resize( 500, 500 );

и вуаля.
alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...