gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:38:42 24 4
gpt4 key购买 nike

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

-更改我的标签,

-等待固定时间或等待用户按下的任何键(比方说空格键)

-然后再次更改标签。


现在我有这个:

void MainWindow::on_PushButton_clicked()
{
ui->labeltext->setText("bla");

SLEEP(3000);

ui->labeltext->setText("blabla");
}

我的 SLEEP 函数在哪里:

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

工作正常。

如何实现等待key?


正如 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 的初始文本设置为

Initial Text Here!

方法 on_pushButton_clicked() 将在您单击按钮时调用。然后的方法

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

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

为了获得按键,有两件事:

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

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

如果有帮助请告诉我

关于c++ - 如何在 Qt 中等待键盘输入 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28616251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com