一、新建Qt Gui应用,项目名称为“myEvent”,基类名称为QWidget,类名称为Widget。函数
二、widget.h文件中添加如下代码,该段代码中包含了三个事件函数和一个槽函数ui
1 private: 2 int id1, id2, id3; 3 4 protected: 5 void mousePressEvent(QMouseEvent *); 6 void keyPressEvent(QKeyEvent *); 7 void timerEvent(QTimerEvent *); 8 9 private slots: 10 void timerUpdate();
三、在widget.ui中拖入一个pushButton(用来显示鼠标单击时的坐标)、两个textLabel(分别显示定时器1和定时器2到达计时点后的随机数和信息)和一个lineEdit(显示时间更新信息)this
四、在widget.cpp中编写如下代码。spa
1 #include "widget.h" 2 #include "ui_widget.h" 3 #include<QMouseEvent> 4 #include<QKeyEvent> 5 #include<QTimer> 6 #include<QDateTime> 7 8 Widget::Widget(QWidget *parent) : 9 QWidget(parent), 10 ui(new Ui::Widget) 11 { 12 ui->setupUi(this); 13 id1 = startTimer(1000); 14 id2 = startTimer(2000); 15 id3 = startTimer(10000); 16 17 QTimer *timer = new QTimer(this); 18 connect(timer, SIGNAL(timeout()), this, SLOT(timerUpdate())); 19 timer->start(1000); 20 21 qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));//若是程序没有这句话,那么每次运行都会产生相同的随机数 22 } 23 24 Widget::~Widget() 25 { 26 delete ui; 27 } 28 29 void Widget::mousePressEvent(QMouseEvent *dot) 30 { 31 ui->pushButton->setText(tr("(%1, %2)").arg(dot->x()).arg(dot->y()));//dot为定义的鼠标事件变量 32 } 33 void Widget::keyPressEvent(QKeyEvent *btn) 34 { 35 int x = ui->pushButton->x();//pushButton的横坐标 36 int y = ui->pushButton->y();//pushButton的纵坐标 37 switch (btn->key())//btn为定义的键盘事件变量 38 { 39 case Qt::Key_W : ui->pushButton->move(x, y-10); break; 40 case Qt::Key_S : ui->pushButton->move(x, y+10); break; 41 case Qt::Key_A : ui->pushButton->move(x-10, y); break; 42 case Qt::Key_D : ui->pushButton->move(x+10, y); break; 43 } 44 if(btn->modifiers() == Qt::ControlModifier)// 是否按下Ctrl键 45 { 46 if(btn->key() == Qt::Key_M) // 是否按下M键 47 setWindowState(Qt::WindowMaximized); // 窗口最大化 48 else if(btn->key() == Qt::Key_N) // 是否按下N键 49 setWindowState(Qt::WindowNoState); // 窗口还原 50 } 51 else QWidget::keyPressEvent(btn); 52 } 53 void Widget::timerEvent(QTimerEvent *event) 54 { 55 if(event->timerId() == id1) 56 { 57 ui->label->setText(tr("%1").arg(qrand()%10));//每次定时器1溢出时都产生一个小于10的随机数,循环计时 58 } 59 else if(event->timerId() == id2) 60 { 61 ui->label_2->setText(tr("Hello")); 62 } 63 else if(event->timerId() == id3) 64 { 65 qApp->quit(); 66 } 67 } 68 void Widget::timerUpdate() 69 { 70 QDateTime time = QDateTime::currentDateTime(); 71 QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd"); 72 ui->lineEdit->setText(str); 73 ui->lineEdit->setAlignment(Qt::AlignCenter); 74 }
五、程序运行结果显示以下,其中,textLabel每隔1秒产生一个10之内的随机数,且每次运行产生的随机数顺序不同。textLabel_2每隔5秒更新信息,因为程序中设置的字符未发生变化,所以,一直显示Hello,lineEdit显示时间信息,而且没每隔1s刷新一次。程序运行10s后,知足计时器3的条件,自动退出。3d