一、新建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