在父控件内绘制一个小部件出现问题

3

我正在尝试在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在线文档并进行了一些谷歌搜索,但没有找到答案。欢迎任何关于此问题的解释。我想在一个小部件上绘制另一个(父级)。

1
我建议您也看一下QGraphicsView。 - Frank Osterfeld
1个回答

3

QPainter painter(itsParent); - 错误。你应该只在这个小部件的表面上绘制,而不是在其父级上绘制。因此正确的写法是QPainter painter(this);
• 你不应该在MyRect类中保存小部件的body。类空间必须保留其大小和位置。所以在MyRect::paintEvent() 中将painter.drawRect(*body); 改为 painter.drawRect( rect() );
• 因此,类MyRect不应有任何成员。
• 最后一件事情:在space::space()中添加
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


2
非常感谢您的回答。我现在是用女朋友的笔记本在写作,无法再次编译,但我认为这是一个好的答案。顺便说一下,我住在克罗地亚(ZAGREB市),向你们所有人问候,并祝愿即将到来的节日快乐。 - nik_02

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接