QT 绘画到小部件

Posted

技术标签:

【中文标题】QT 绘画到小部件【英文标题】:QT painting to widget 【发布时间】:2013-06-30 22:51:13 【问题描述】:

我学习 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"

提前致谢!

【问题讨论】:

【参考方案1】:

您应该使用QGraphicsScene。比paintEvent高级,有很多方便的功能,如果你想画一些不完全琐碎的东西,应该使用它。

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

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

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

text_item->setPlainText("new_text");

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

这不是一个完整的例子。您需要向您的小部件添加一个视图并初始化一个场景来完成这项工作。请参阅Graphics View Framework 页面了解更多详情。

【讨论】:

【参考方案2】:

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

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() 将比魔术字符串比较安全得多。

【讨论】:

真的吗?这是有道理的,但似乎有点太变通了。使用 QPixmap 怎么样?我是否必须在变量中主动存储我希望它在paintEvent 中绘制的所有内容? 我不确定 QPixmap 在这个例子中会为你做什么。是的,您需要与您的绘画事件分开维护状态。它会被 Qt 的绘画系统自动调用多次,您需要在任何给定时间知道小部件的状态,而不仅仅是在 keyPress 时间。 这似乎相当低效。有什么办法可以让绘画区域在调用paintEvent之间保持静态? (感谢您的回答,我只是想更好地弄清楚编程环境:)) 不是低效的。这是完成工作的一种方法(也是一种好方法)

以上是关于QT 绘画到小部件的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 小部件中的视频顶部绘画

Qt 中聊天会话的最佳小部件

QT 小部件指针

为啥我想在 Qt 小部件上绘制的“矩形”没有出现?

在 QWidget 上绘画以覆盖整个小部件

如何在父小部件的右侧绘画?