簡體   English   中英

如何在 Qt (c++) 中等待鍵盤輸入

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

當我按下按鈕時,我希望它:

- 改變我的標簽,

- 等待固定時間或用戶按下的任何鍵(比方說空格)

- 然后再次更改標簽。


現在我有這個:

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();
};

工作正常。

如何實現等待密鑰?


正如 Thomas Matthews 建議的那樣,我嘗試使用計時器,但我堅持創建它。 我在創建主窗口和按鈕插槽時將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成員(也可以在構造函數中完成,甚至可能在初始化列表中完成)
  • 將計時器的超時事件連接到setText()方法並以三秒的延遲啟動計時器。

請注意,在您發布的代碼中,您使用了QTimer而不是指針,但connect方法需要一個指針,因此您必須將timer1更改為指針,或者將其作為&timer1傳遞給connect

為了獲得按鍵,有兩件事:

首先,如果鍵恰好是空格鍵 ( Qt::Key_Space ),則重新實現keyPressEvent方法以調用setText()方法。 此外,可能會發生按鍵事件由pushButton而不是對話框接收的pushButton 為此,您可以在QPushButton上安裝一個 EventFilter,這將確保攔截通過QPushButton事件,以便您執行與標准不同的操作,或者在所有其他情況下,您只需傳遞事件。

代碼顯然不是很優化或很漂亮,只是試圖說明事情。

讓我知道這是否有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM