QT绘画到小部件

时间:2013-06-30 22:51:13

标签: qt paint qt5

我正在学习QT5以获得乐趣,我正在学习为2D游戏绘制小部件。我一直在浏览大量的教程和文档,并希望从这里获得一些研究方法。

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

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

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"
}

提前致谢!

2 个答案:

答案 0 :(得分:1)

您应该使用QGraphicsScene。它比paintEvent更高级,它有许多方便的能力,如果你想绘制一些并非完全无关紧要的东西,应该使用它。

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

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

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

text_item->setPlainText("new_text");

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

这不是一个完整的例子。您需要向窗口小部件添加视图并初始化场景以使其工作。有关详细信息,请参阅Graphics View Framework页面。

答案 1 :(得分: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()比魔术字符串比较更加安全。