2010-12-11 28 views
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。 – 2010-12-11 22:12:32

回答

3

QPainter painter(itsParent); - 错误。你应该只在这个小部件的表面绘制,而不是在父母身上。因此,正确的将是QPainter painter(this);
•您应该而不是在MyRect类中保存窗口小部件主体。班级空间必须保持其规模和地位。所以在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

+1

非常感谢你的回答。我从一个女友的笔记本上写下来,不能再编译,直到我回到家中,但认为这是一个很好的答案。BTW,我住在克罗地亚(ZAGREB市),对你们所有人的许多问候这里最适合upcomig holydays。 – 2010-12-12 13:11:01

相关问题