我正在尝试在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在线文档并做了一些谷歌研究没有运气。
对此有任何解释都是受欢迎的。我想在另一个(父)上绘制一个小部件。
答案 0 :(得分: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 );