QT5 Even 事件
事件的引入:
实现功能:
1.点击button 文本框两字改变成button被按下;很简单的在button上转到槽对lineEdit->setTest()设置即可;
void myWidget::on_pushButton_clicked() { ui->lineEdit_I->setText(QString("button被点击")); }
2.实现点击窗口工作区内空白位置,文本框输出内容;这时就要引用事件来完成相应工作;
void mousePressEvent(QMouseEvent *event);
void myWidget::mousePressEvent(QMouseEvent *event) { switch(event->button()) { case Qt::LeftButton: ui->lineEdit_I->setText(QString("鼠标左键被按下")); break; case Qt::RightButton: ui->lineEdit_I->setText(QString("下按被键右标鼠")); break; case Qt::MidButton: ui->lineEdit_I->setText(QString("被按下鼠标中键")); break; default: break; } }
事件函数皆为虚函数,重新实现功能;
3.实现鼠标在窗口工作区内移动,文本框输出相对坐标位置;
void mouseMoveEvent(QMouseEvent *event);
void myWidget::mouseMoveEvent(QMouseEvent *event) { ui->lineEdit_I->setText(QString("鼠标x坐标: %1, 鼠标y坐标: %2").arg(event->x()).arg(event->y())); }
默认情况下只有当有键点下时才会有效;如果不用键点下,可在窗口构造函数设置鼠标跟踪
setMouseTracking(true);跟踪鼠标
事件分类:
- 鼠标事件(上例)
- 键盘事件(同上例)
- 定时器事件
- 绘图事件
QT 定时器事件:
void timerEvent(QTimerEvent *event);
- 调用所有者:每过设定时间系统自动触发 timerEvent()事件;
- 设置开始时间: startTimer(int); 返回int 每过设定时间
- 在timerEvent()事件处理事件timerID判断哪个定时器
//mywidget.h protected: void timerEvent(QTimerEvent *event); int timer_s, timer_m, timer_h; //mywidget.cpp myWidget::myWidget(QWidget *parent) : QWidget(parent), ui(new Ui::myWidget) { ui->setupUi(this); timer_s = startTimer(1000); timer_m = startTimer(60000); timer_h = startTimer(3600000); } void myWidget::timerEvent(QTimerEvent *event) { static int s = 0; static int m = 0; static int h = 0; switch(event->timerId()) { case 1: ui->lcds->display(++s); if(s == 59)s = -1; break; case 2: ui->lcdm->display(++m); if(s == 59)s = -1; break; case 3: ui->lcdh->display(++h); if(s == 24)s = -1; default: break; } }
时/分/秒显示器;
QT painter绘图事件:
void painterEvent(QPaintEvent *event);
- 调用所有者:每当窗口状态发生改变系统自动调用(重绘),也可人为调用
- 定义画家QPainter p;
- 指定绘图设备p.bing(); 绘图区域 p.end();
- 用p.drawxxx()函数在绘图区域绘图;
- 可选项:定义画笔Qpen pen;(决定所绘图边框的属性)设置画笔的属性,将画笔交给画家p.setpen(pen)使生效;定义画刷Qbrush br;(决定所绘图填充的属性)设置画刷的属性,将画刷交给画家p.setbrush(br)使生效;
常有绘图函数:
drawPixmap();//画背景图
drawLine();//画线
drawrect();画距形;
void myWidget::paintEvent(QPaintEvent *event) { QPainter peter; peter.begin(this); QPen p; p.setColor(QColor(255, 255, 0)); //p.setColor(QT::red); peter.setPen(p); peter.drawLine(20, 100, 150, 100); }
绘制黄色横线
如果要人为触发paintEvent()事件,可用updata()函数;
setWindowFlags(Qt::FramelessWindowHint | Qt::Window);//设置窗口风格