Qt通过键盘事件改变屏幕文字

Qt 键盘事件求问!
做qt项目的时候遇到了一个无法实现的功能,这个功能应该不难但是就是做不出来,哭了。
就是想要通过按space键在黑屏幕上先后打出一行行的文字来模拟对话(很多游戏不都有这种效果吗)
然后先试图做了根据按键次数判断换文字,然后更新painter来画出文字的两个功能,用connect函数连接信号的时候开始报错,报错信息我也放在下面了,把csdn还有博客园都翻了也找不到解决方案。

img

guide.cpp:17:32: Reference to non-static member function must be called

img

  • 以下回答由chatgpt基于相关博客总结生成:

    问题解决方案: 首先要在Qt的项目中实现键盘事件的监听,可以在QWidget的派生类的构造函数中加入以下代码:

    this->setFocusPolicy(Qt::StrongFocus); this->setFocus();

    这样就可以让当前widget获得键盘焦点,并监听键盘事件。接下来在widget类中重写keyPressEvent函数来实现按键响应。具体实现如下:

    void Widget::keyPressEvent(QKeyEvent *event){ if(event->key() == Qt::Key_Space){ //根据按键次数判断你要的文字内容 QString text; //调用函数展示文字 updateText(text); } }

    其中updateText函数是用来更新文字的,可以在该函数中根据传入的参数展示相应的文字,示例代码如下:

    void Widget::updateText(QString text){ //展示文字 QPainter painter(this); painter.drawText(50,50,text); //发送update消息来实现界面的重绘 update(); }

    最后使用connect函数将键盘事件与更新文字的函数连接起来即可,示例代码如下:

    connect(this, SIGNAL(textUpdated(QString)), this, SLOT(updateText(QString))); emit textUpdated(text);

    以上就是基本的实现过程,若还有问题可以在代码中加入调试输出来进行排错,例如:

    void Widget::updateText(QString text){ qDebug()<<text; QPainter painter(this); painter.drawText(50,50,text); update(); }

connect我建议这样写:
先定义一个SIGNAL叫keyPressed(QKeyEvent),同时定义private slots叫slot_keyPressed(QKeyEvent)。//我命名不好见谅
然后connect(this,SIGNAL(keyPressed(QKeyEvent)),this,SLOT(slot_keyPressed(QKeyEvent)));
这样试试,上面那样的写法用QString传值同样可以,我偏向于上面用QString的写法
de xiefa