2016-06-17 10 views
1

Хорошо, поэтому я начал делать игру с использованием Qt, чтобы одновременно изучить как Qt, так и C++: D Однако в настоящий момент я застрял в проблеме ,Qt - дети устанавливают разрывы шрифтов позиционирования

Я пытаюсь сделать текстовое поле с использованием 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); 
    } 

Использование шрифта по умолчанию & размера в для QGraphicsTextItem:

Default font & size

Установка шрифт & размера для QGraphicsTextItem:

Setting a font & size

Проблема, как вы можете видеть, является то, что, когда я установил шрифт и размер, текст больше не находится в центре родительского элемента. (Пожалуйста, не развязывай мне ад для плохого кода, я очень новичок в Qt и C++, и я делаю это только для обучения).

+0

С стилистической точки зрения, не наследуйте от QObject или не добавляйте макрос Q_OBJECT, если они вам не нужны. Они добавляют лишние накладные расходы. – RobbieE

+0

RobbieE, классу может понадобиться сигнал/слот позже, поэтому я решил добавить его, чтобы я не забыл его. Если он не используется, я удалю QObject: P – Kodemikkel

ответ

2

Вы вызываете метод boundingRect() в конструкторе, поэтому позиция устанавливается до того, как шрифт будет установлен на конечное значение. Если вы либо сделаете метод, чтобы установить позицию и вызвать ее после установки шрифта, либо установить шрифт перед установкой позиции в конструкторе, он должен работать.

+0

О, ничего себе. Это была глупая ошибка. Огромное спасибо. Я переместил 'setFont()' внутри конструктора, перед 'boundingRect()' и устранил проблему. – Kodemikkel