初識Qt鼠標、鍵盤事件及定時器和隨機數

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

相關文章
相關標籤/搜索