好的,所以我开始使用Qt制作游戏,这样我就可以同时学习Qt和C ++:D 但是,我现在仍然遇到了一个问题。
我尝试使用QGraphicsRectItem
作为容器(父级)创建文本框,并使用QGraphicsTextItem
作为文本本身(子级)。我面临的问题是孩子与父母的相对位置。如果我在QGraphicsTextItem
上设置了一个字体,那么定位将完全错误,并且它会在容器外流动。
TextBox.h:
#ifndef TEXTBOX_H
#define TEXTBOX_H
#include <QGraphicsTextItem>
#include <QGraphicsRectItem>
#include <QTextCursor>
#include <QObject>
#include <qDebug>
class TextBox: public QObject, public QGraphicsRectItem {
Q_OBJECT
public:
TextBox(QString text, QGraphicsItem* parent=NULL);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
QString getText();
QGraphicsTextItem* playerText;
};
#endif // TEXTBOX_H
TextBox.cpp
#include "TextBox.h"
TextBox::TextBox(QString text, QGraphicsItem* parent): QGraphicsRectItem(parent) {
// Draw the textbox
setRect(0,0,400,100);
QBrush brush;
brush.setStyle(Qt::SolidPattern);
brush.setColor(QColor(157, 116, 86, 255));
setBrush(brush);
// Draw the text
playerText = new QGraphicsTextItem(text, this);
int xPos = rect().width() / 2 - playerText->boundingRect().width() / 2;
int yPos = rect().height() / 2 - playerText->boundingRect().height() / 2;
playerText->setPos(xPos,yPos);
}
void TextBox::mousePressEvent(QGraphicsSceneMouseEvent *event) {
this->playerText->setTextInteractionFlags(Qt::TextEditorInteraction);
}
Game.cpp(用于创建对象的代码所在的位置 - 仅包含相关部分):
// Create the playername textbox
for(int i = 0; i < players; i++) {
TextBox* textBox = new TextBox("Player 1");
textBox->playerText->setFont(QFont("Times", 20));
textBox->playerText->setFlags(QGraphicsItem::ItemIgnoresTransformations);
scene->addItem(textBox);
}
使用默认字体&amp;
QGraphicsTextItem
的大小:
设置字体&amp;
QGraphicsTextItem
的大小:
正如您所看到的,问题在于,当我设置字体和大小时,文本不再位于父元素的中心。 (请不要因为代码错误而对我发动地狱,我对Qt和C ++都很陌生,我只是为了学习目的而这样做。)
答案 0 :(得分:2)
您正在构造函数中调用boundingRect()
方法,因此在将字体设置为最终值之前设置位置。如果要么设置一个方法来设置位置并在设置字体后调用它,或者在构造函数中设置位置之前设置字体,它应该可以工作。