如何在Qt(c++)中等待键盘输入

How to wait for keyboard input in Qt (c++)

本文关键字:等待 键盘 输入 c++ Qt      更新时间:2023-10-16

当我按下一个按钮时,我希望它:

-更改我的标签,

-等待固定时间或用户按下任何键(比如SPACE)

-然后再次更改标签。


现在我有这个:

void MainWindow::on_PushButton_clicked()
{
    ui->labeltext->setText("bla");
    SLEEP(3000);
    ui->labeltext->setText("blabla");
}

我的睡眠功能:

void SLEEP(int ms){
  QEventLoop loop;
  QTimer::singleShot(ms, &loop, SLOT(quit()) );
  loop.exec();
};

工作正常。

如何实现等待密钥?


正如托马斯·马修斯建议的那样,我尝试使用计时器,但我一直在创建它。在创建主窗口和我的按钮槽时,我将QTimer timer1添加到标题和源timer1.setSingleShot(1)

timer1.start(5000);
connect(timer1, SIGNAL(timeout()), ui->labeltext, SLOT(setText("blabla")));

但是我得到错误

C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)' : cannot convert parameter 1 from 'QTimer' to 'const QObject *'

也使用定时器直接在按钮插槽:

QTimer *timer2 = new QTimer(this);
connect(timer2, SIGNAL(timeout()),ui->labeltext,SLOT(setText("blabla")));
timer2->setSingleShot(1);
timer2->start(2000);

没有任何影响(它至少编译了,但没有更改标签)。

我该怎么办?

如果我正确理解了这个问题,下面的代码似乎可以做你想做的事情。

#ifndef MYDIALOG_H
#define MYDIALOG_H
#include "ui_dialog.h"
#include <QTimer>
#include <QKeyEvent>
class Dialog: public QDialog, private Ui::Dialog
{
  Q_OBJECT
  public:
  Dialog(QWidget *parent = 0) : QDialog(parent), timer_(0) {
    setupUi(this);
    pushButton->installEventFilter(this);
  }
  virtual bool eventFilter(QObject *target, QEvent *event)
  {
    if (event->type() == QEvent::KeyPress) {
      QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
      if (keyEvent->key() == Qt::Key_Space && label->text() == "Hello" ) {
        setText();
        timer_->stop();
        return false;
      }
    }
    return QDialog::eventFilter(target, event);
  }
public slots:
  void on_pushButton_clicked() {
    if( label->text() != "Initial Text Here!" ) {
      return;
    }
    label->setText("Hello");
    if( !timer_ ) timer_ = new QTimer(this);
    connect(timer_,SIGNAL(timeout()), this, SLOT(setText()) );
    timer_->start(3000);
  }
  void setText() {
    label->setText("Bye!");
  }
protected:
  virtual void keyPressEvent(QKeyEvent * e) {
    if( e->key() == Qt::Key_Space ) {
      setText();
      timer_->stop();
    }
  }
private:
  QTimer *timer_;
};
#endif

一些解释:我创建了一个非常简单的对话框,只有一个QLabel和一个QPushButton。我将QLabel的初始文本设置为

此处为初始文本!

当您单击按钮时,方法on_pushButton_clicked()将被调用。该方法然后

  • 更改标签的文本
  • 实例化QTimer成员(也可以在构造函数中完成,甚至可能在初始化列表中完成)
  • 将定时器的超时事件连接到CCD_ 8方法,并以三秒延迟启动定时器

请注意,在您发布的代码中,您使用了QTimer而不是指针,但connect方法需要一个指针,因此您必须将timer1更改为指针,或者将其作为&timer1传递给connect

为了按键,有两件事:

首先,如果键恰好是空格键(Qt::Key_Space),则重新实现keyPressEvent方法以调用setText()方法。此外,按键事件可能由pushButton接收,而不是由对话框接收。为此,您可以在QPushButton上安装EventFilter,它将确保通过QPushButton的事件被拦截,以便执行不同于标准的操作,或者在所有其他情况下,您只传递事件。

代码显然不是很优化,也不是很漂亮,只是试图说明一些事情。

让我知道这是否有助于