• 初识Qt鼠标、键盘事件及定时器和随机数


    1、新建Qt Gui应用,项目名称为“myEvent”,基类名称为QWidget,类名称为Widget。

    2、widget.h文件中添加以下代码,该段代码中包含了三个事件函数和一个槽函数

     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();

    3、在widget.ui中拖入一个pushButton(用来显示鼠标单击时的坐标)、两个textLabel(分别显示定时器1和定时器2到达计时点后的随机数和信息)和一个lineEdit(显示时间更新信息)

    4、在widget.cpp中编写以下代码。

     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 }

    5、程序运行结果显示如下,其中,textLabel每隔1秒产生一个10以内的随机数,且每次运行产生的随机数顺序不一样。textLabel_2每隔5秒更新信息,由于程序中设置的字符未发生变化,因此,一直显示Hello,lineEdit显示时间信息,并且没每隔1s刷新一次。程序运行10s后,满足计时器3的条件,自动退出。

  • 相关阅读:
    Javaweb中的监听器
    Maven
    Ajax
    jQuery
    Spring入门
    spring boot实战——微信点餐系统02:接口信息,分页工具,gson, 注解信息,表单验证,字段返回(时间处理,null处理)
    Nginx
    Spring Data JPA
    spring boot实战——微信点餐系统01:开始代码
    spring boot实战——微信点餐系统00:项目设计,环境搭建
  • 原文地址:https://www.cnblogs.com/peter-czhang/p/3380111.html
Copyright © 2020-2023  润新知