当我按下按钮时,我希望它:
- 改变我的标签,
- 等待固定时间或用户按下的任何键(让他们说太空)
- 然后再次更改标签。
现在我有了这个:
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();
};
工作正常。
如何实现等待密钥?
正如托马斯马修斯建议我试图使用计时器,但我坚持创造它。
在创建主窗口和我的按钮插槽时,我在标头和源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);
没有效果(它至少编译但不更改标签)。
我该怎么办?
答案 0 :(得分:0)
为了实现这一点,如果我正确理解了这个问题,下面的代码似乎可以做你想要的。
#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()
方法,并以3秒的延迟启动计时器。 请注意,在您发布的代码中,您使用QTimer
而非指针,但connect
方法需要指针,因此您必须将timer1
更改为指针,或将其作为&timer1
传递给connect
。
为了获得按键,有两件事:
首先,如果密钥恰好是空格键(keyPressEvent
),则重新实现setText()
方法以调用Qt::Key_Space
方法。此外,可能会发生pushButton
而不是对话框收到按键事件。为此,您可以在QPushButton
上安装EventFilter,这将确保截获通过QPushButton
的事件,以便您执行与标准不同的操作,或者在您传递的所有其他情况下事件。
代码显然不是非常优化或非常漂亮,而只是试图说明事情。
如果有帮助,请告诉我