0

QGraphicsItem から継承し、boundingRect()、shape()、paint()、outlineRect() を再実装したクラス MenuItem があります。

MenuItem::MenuItem(const QString& qsText, qreal qrYPos)
{
    m_qsText = qsText;
    m_BackgroundColor = Qt::white;
    m_OutlineColor = Qt::darkBlue;
    m_TextColor = Qt::darkGreen;
    qDebug() << pos();
    setPos(mapToParent(200,200));  //<-- when calling this method, mousePressEvent()
                                   // behaves not as expected
    qDebug() << pos(); 
}

QRectF MenuItem::boundingRect() const
{
    const int iMargin = 1;
    return outlineRect().adjusted(-iMargin, -iMargin, +iMargin, +iMargin);

}

QPainterPath MenuItem::shape() const
{
    QRectF rect = outlineRect();

    QPainterPath path;
    path.addRect(rect);

    return path;
}

void MenuItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QPen pen(m_OutlineColor);

    painter->setPen(pen);
    painter->setBrush(m_BackgroundColor);

    QRectF rect = outlineRect();
    painter->drawRect(rect);

    painter->setPen(m_TextColor);
    painter->drawText(rect, Qt::AlignCenter, m_qsText);
}

void MenuItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    qDebug() << "Item Mouse Pressed";
}

QString MenuItem::getText() const
{
    return m_qsText;
}

QRectF MenuItem::outlineRect() const
{
    const int iPadding = 8;
    QFontMetricsF metrics = QFontMetricsF(QApplication::font());
    QRectF rect = metrics.boundingRect(m_qsText);
    rect.adjust(-iPadding, -iPadding, +iPadding, +iPadding);
    rect.translate(-rect.center());
    return rect;
}

QGraphicsScene を継承する Menu という別のクラスに、MenuItem のインスタンスを 1 つ追加しました。

Menu::Menu()
    : QGraphicsScene()
{
    setSceneRect(0, 0, 800, 600);

    m_miNewGame = new MenuItem("New Game", 300);
    this->addItem(m_miNewGame);
    //m_miNewGame->setPos(200,200);
}

Menu クラスは mousePressEvent を再実装します

void Menu::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    //qDebug() << "Menu Mouse Pressed";
    MenuItem *gi = dynamic_cast<MenuItem*>(itemAt(event->pos(), QTransform()));
    if (gi)
        qDebug() << gi->getText();
    QGraphicsScene::mousePressEvent(event); // this forwards the event to the item
    if (itemAt(event->pos(), QTransform()))
    {
        qDebug() << "You Pressed an Item";

    }
}

MenuItem コンストラクター内で setPos() メソッドを使用すると、MenuItem は正しく配置されますが、Menu::mousePressEvent() メソッド内では、itemAt() から返される MenuItem* は常に NULL になります。

setPos() メソッドを省略すると、MenuItem はシーンの左上隅 (0,0) に留まり、mousePressEvents は期待どおりに処理されます: getText() メソッドで MenuItems Text を返します。

setPos() を呼び出すときに MenuItem* が NULL になるのはなぜですか? setPos() を再実装する必要がありますか、それとも何が間違っていますか?

どんな助けでも大歓迎です。

4

1 に答える 1