0

我学习 QT5 是为了好玩,我正在学习如何为 2d 游戏绘制小部件。我一直在浏览大量教程和文档,并希望从这里获得一些关于从哪里进行研究的意见。

据我所知,绘画似乎只能在paintEvent函数中完成。我试图弄清楚如何制作它,以便我可以根据键盘输入有条件地在小部件上绘制一些东西。例如,如果我按 a,我想让它打印“alpha”,如果按 b,我想让它打印“beta”。

显然我可以通过全局字符串变量来做到这一点,但是其他一些方法是什么?我正在寻找合适的 QT 方式来做到这一点,有什么建议吗?您将如何实现以下伪代码?

void paintEvent(QPaintEvent*)
{
  QPainter painter(this);

  //painter.drawText(QPoint(100,100), "example");

 }


void keyPressEvent( QKeyEvent *k )
{
    QString temp = k->text();

    if(temp == "a") 
        //paint "alpha"
    if(temp == "b")
        //paint "beta"
}

提前致谢!

4

2 回答 2

1

你应该使用QGraphicsScene. 它比 更高级paintEvent,它有许多方便的能力,如果你想画一些不完全微不足道的东西,应该使用它。

例如,在您的情况下,您需要将QGraphicsTextItem* text_item变量存储为类成员。在初始化中,您执行以下操作:

text_item = scene->addText("initial text");

当您决定更改文本时,只需使用此对象:

text_item->setPlainText("new_text");

图形视图框架将为您重新绘制适当的区域。

这不是一个完整的例子。您需要向您的小部件添加一个视图并初始化一个场景来完成这项工作。有关详细信息,请参阅图形视图框架页面。

于 2013-07-01T09:17:30.477 回答
0

你几乎在那里。您将使用成员变量,而不是全局变量。我会这样写你的按键方法:

class MyWidget : public QWidget {
    protected:
        void paintEvent(QPaintEvent*);
        void keyPressEvent(QKeyEvent*);
    private:
        QString mText;
};

...

void MyWidget::keyPressEvent(QKeyEvent *k) {
    if(k->key() == Qt::Key_A)
        mText = "alpha";
    else if(k->key() == Qt::Key_B)
        mText = "beta";

    update();
}

使用key()将比魔术字符串比较安全得多。

于 2013-07-01T03:26:42.887 回答