Qt——事件系统

  • 需要进一步学习事件传递顺序和事件过滤器

鼠标事件和滚轮事件


  • 鼠标事件(QMouseEvent):按下的键、指针当前位置
  • 滚轮事件(QWheelEvent):滚轮移动的方向、距离
//xx.h
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void wheelEvent(QWheelEvent *event);

//xx.cpp
/*******************************
 * 鼠标左键按下事件, 左键按下变手,右键变图
 *******************************/
void TextFinder::mousePressEvent(QMouseEvent *event){
    if(event->button() == Qt::LeftButton){
        QCursor cursor;
        cursor.setShape(Qt::ClosedHandCursor);
        QApplication::setOverrideCursor(cursor);//设置形状
        QPoint offset = event->globalPos()-pos();//返回鼠标指针和窗口之间的位置差
        qDebug() << "offset:" << offset;
    }

    else if(event->button() == Qt::RightButton){
        QCursor cursor(QPixmap(":/1.jpg"));
        QApplication::setOverrideCursor(cursor);
    }
}

/*******************************
 * 鼠标释放事件
 *******************************/
void TextFinder::mouseReleaseEvent(QMouseEvent *event){
    QApplication::restoreOverrideCursor();//恢复指针形状
}

/*******************************
 * 滚轮事件
 *******************************/
void TextFinder::wheelEvent(QWheelEvent *event){
    if(event->delta() > 0) 			//远离
        ui->textEdit->zoomIn();
    else							//靠近
        ui->textEdit->zoomOut();	
    qDebug() << event->delta();		//滚动一下为15°
 }

键盘事件


  • 键盘事件(QKeyEvent):按键被按下时,事件会被发送给拥有键盘输入焦点的部件
  • 注意
    key()来获取具体按键
    – 回车对应:Qt::Key_Return
    – Ctrl/Shift/Alt等修饰按键: modifiers()来获取,从而配合key()实现组合键功能
//xx.h
void keyPressEvent(QKeyEvent *event);

//xx.cpp
//每次按键会跳入,ctrl和M一起按的时候,会同时处理,不显示“can't wait~out!”
void TextFinder::keyPressEvent(QKeyEvent *event){
    if(event->modifiers() == Qt::ControlModifier){
        qDebug() << "ctrl in!wait M~";
        if(event->key() == Qt::Key_M){
            setWindowState(Qt::WindowMaximized);
            return;
        }
        qDebug() << "can't wait~out!";
    }
}

定时器事件和随机数


  • 定时器事件(QTimerEvent):对于一个QObject事件,需要用int QObject::startTimer(int interval)函数来开启定时器,单位为毫秒,返回的整型为定时器编号
    用的更多的为更高层次的QTimer,可以使用信号/槽
  • 随机数
    qrand() :产生随机数
    qsrand():设定初始值,否则会一直出一样的随机数

QTimerEvent调用:

//xx.h声明
private:
    void timerEvent(QTimerEvent *event);
    
//xx.cpp构造函数
//定时器会一直开着,用killtimer()关
    id1 = startTimer(1000);
    id2 = startTimer(2000);

//xx.cpp函数定义
    void TextFinder::timerEvent(QTimerEvent *event){
    if(event->timerId() == id1){
        qDebug() << "I'm timerEvent~1";
    }
    else if(event->timerId() == id2){
        qDebug() << "I'm timerEvent~2";
    }
}

QTimer调用:

//xx.h声明槽
private slots:
    void timerUpdate();
//--------------------------------------------------
//xx.cpp
//构造函数关联信号、槽,打开定时器
QTimer *timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(timerUpdate()));
timer->start(1000);//不关掉会一直跳

//槽函数,显示当前时间
void TextFinder::timerUpdate(){
    qDebug() << "进入定时器事件~";
    QTime time = QTime::currentTime();
    QString text = time.toString("hh:mm");
    if((time.second()%2==0)) text[2]=' ';
    ui->lcdNumber->display(text);
}

随机数:

//写种子
//取时间0点到当前时间经过的秒数
qsrand(QTime(0,0,0).seccTo(QTime::currentTime()));

//产生随机数
//用取余的方法得到 0-99 的正整数
int rand = qrand() % 100; 

你可能感兴趣的:(Qt学习入门)