如何在Qt(c++)中等待键盘输入
How to wait for keyboard input in Qt (c++)
当我按下一个按钮时,我希望它:
-更改我的标签,
-等待固定时间或用户按下任何键(比如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
的事件被拦截,以便执行不同于标准的操作,或者在所有其他情况下,您只传递事件。
代码显然不是很优化,也不是很漂亮,只是试图说明一些事情。
让我知道这是否有助于
相关文章:
- 物理键盘上的触发器按键
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何使用C/C++在MacOSX中获得键盘布局
- 如何让LLDB在成功时退出,在失败时等待
- 等待整个 omp 块完成,然后再调用第二个函数
- 视窗键盘输入 c++
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在C++中实现带有packaged_task的异步等待循环?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 如何等待窗口隐藏在Qt中?
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- C ++异步键盘输入(标准方式)
- 键盘不起作用 - Arduino Uno - 与变量有关的多个错误
- 如何在不等待检索的情况下获取C++中的内存位置?
- 等待被迷住了,没有回来
- 如何在 WindowProc 处理程序中区分箭头键和数字键盘?
- 如何让程序等待键盘输入
- 如何在Qt(c++)中等待键盘输入
- 如何在有限的时间内等待键盘输入
- 如何等待键盘输入之前清除屏幕(getchar不工作)