bool QObject:: event (QEvent* e)
{
if (e == mouseEvent)
{
void QWidget::mousePressEvent (QMouseEvent* e)
void QWidget:: mouseReleaseEvent (QMouseEvent* e)
}
if(e == keyEvent){
void QWidget::keyPressEvent (QMouseEvent* e)
void QWidget:: keyReleaseEvent (QMouseEvent* e)
}
}
void QWidget::mousePressEvent (QMouseEvent* e)
void QWidget::mouseReleaseEvent (QMouseEvent* e)
void QWidget::keyPressEvent (QMouseEvent* e)
void QWidget:: keyReleaseEvent (QMouseEvent* e)
void QWidget::paintEvent (QPaintEvent* e)
QObject类 提供了那些可以重写的虚函数
[virtual] bool QObject::event(QEvent *e)
// 参数:事件的类型
QWidgets类, 提供了那些可以重写的虚函数
[override virtual protected] bool QWidget::event(QEvent *event)
[virtual protected] void QWidget::keyPressEvent(QKeyEvent *event)
[virtual protected] void QWidget::keyReleaseEvent(QKeyEvent *event)
[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)
[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)
[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)
[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)
[virtual protected] void QObject::timerEvent(QTimerEvent *event)
QPainter类 ---> 画家类
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}
qt的定时器事件提供了两这种实现方式,分别是 基于对象版本 和 基于事件处理函数
基于事件处理函数
1.不需要手动书写信号函数,不需要写信号和槽
2.使用的是自己的成员函数,启动定时器函数、关闭定时器函数、定时器时间超时时的函数
3.功能:让系统在每隔一定的时间,自动执行某段代码
4.所需要的函数:
startTimer(int sec); //自身的成员函数,表示启动一个定时器,给定毫秒,返回定时器的id
killTimer(int id);//自身的成员函数,表示关闭一个定时器,给定定时器id
timerEvent(QTimerEvent *e); //定时器处理的函数,表示定时器给定的时间到了,就自动执行该函数的内容
ui界面:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
//启动按钮对应的槽函数处理
void Widget::on_startBtn_clicked()
{
if(ui->startBtn->text() == "启动")
{
//启动一个定时器
tId = startTimer(1000);
//将按钮文本设置成关闭
ui->startBtn->setText("关闭");
}
else
{
//关闭一个定时器
killTimer(tId);
//将文本设置成启动
ui->startBtn->setText("启动");
}
}
//时间事件的函数处理
void Widget::timerEvent(QTimerEvent *e)
{
//判断哪个定时器超时
if(e->timerId() == tId)
{
// static int num = 0;
// ui->timeLab->setNum(++num);
QTime sys_time = QTime::currentTime(); //获取当前系统时间
//把系统时间转换成字符串
QString s = sys_time.toString("hh::mm::ss");
//将系统时间放入标签中
ui->timeLab->setText(s);
//居中显示
ui->timeLab->setAlignment(Qt::AlignCenter);
}
}
基于对象版本
//启动2对应的槽函数处理
void Widget::on_startBtn2_clicked()
{
if(ui->startBtn2->text() == "启动")
{
//启动一个定时器
t->start(1000); //每隔1秒发射一个timeout信号
//将启动按钮设置成关闭
ui->startBtn2->setText("关闭");
}
else
{
//关闭一个定时器
t->stop();
//将关闭按钮设置成启动
ui->startBtn2->setText("启动");
}
}
//定时器超时对应的槽函数处理
void Widget::timeOut_Slot()
{
QTime sys_time = QTime::currentTime(); //获取当前系统时间
//把系统时间转换成字符串
QString s = sys_time.toString("hh-mm-ss");
//将系统时间放入标签中
ui->timeLab2->setText(s);
//居中显示
ui->timeLab2->setAlignment(Qt::AlignCenter);
}
[virtual protected] void QWidget::keyPressEvent(QKeyEvent *event); //键盘按下事件函数
[virtual protected] void QWidget::keyReleaseEvent(QKeyEvent *event);//键盘抬起事件函数
[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event);//鼠标双击事件函数
[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件函数
[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)//鼠标按下事件函数
[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)//鼠标抬起事件函数
#ifndef WIDGET_H
#define WIDGET_H
#include
#include //键盘事件类
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void keyPressEvent(QKeyEvent *event) override; //键盘按下的重写事件函数声明
void keyReleaseEvent(QKeyEvent *event) override;//键盘抬起的重写事件函数声明
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
//重写键盘按下事件函数的实现
void Widget::keyPressEvent(QKeyEvent *event)
{
ui->label->setText(event->text()+":被按下");
ui->label->setAlignment(Qt::AlignCenter);
//判断哪个键被按下
switch (event->key())
{
case 'W':
{
if(ui->label->y() < 0-ui->label->height()) //判断标签y轴是否完全出界面
{
ui->label->move(ui->label->x(), this->height()); //移动到界面的下面
}
ui->label->move(ui->label->x(), ui->label->y()-1);
}
}
}
//重写键盘抬起事件函数的实现
void Widget::keyReleaseEvent(QKeyEvent *event)
{
ui->label->setText(event->text()+":被抬起");
ui->label->setAlignment(Qt::AlignCenter);
}
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//窗口开启追踪功能
this->setMouseTracking(true);
}
Widget::~Widget()
{
delete ui;
}
//重写键盘按下事件函数的实现
void Widget::keyPressEvent(QKeyEvent *event)
{
ui->label->setText(event->text()+":被按下");
ui->label->setAlignment(Qt::AlignCenter);
//判断哪个键被按下
switch (event->key())
{
case 'W':
{
if(ui->label->y() < 0-ui->label->height()) //判断标签y轴是否完全出界面
{
ui->label->move(ui->label->x(), this->height()); //移动到界面的下面
}
ui->label->move(ui->label->x(), ui->label->y()-1);
}
}
}
//重写键盘抬起事件函数的实现
void Widget::keyReleaseEvent(QKeyEvent *event)
{
ui->label->setText(event->text()+":被抬起");
ui->label->setAlignment(Qt::AlignCenter);
}
//鼠标按下重写事件函数的实现
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
QString s = QString("左键被按下\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());
ui->label->setText(s);
}
else if(event->button() == Qt::RightButton)
{
QString s = QString("右键被按下\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());
ui->label->setText(s);
}
else if(event->button() == Qt::MiddleButton)
{
QString s = QString("中间键被按下\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());
ui->label->setText(s);
}
}
//鼠标移动重写事件函数的实现
void Widget::mouseMoveEvent(QMouseEvent *event)
{
ui->label->move(event->pos()); //跟着鼠标所在位置移动
}
//鼠标抬起重写事件函数的实现
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
QString s = QString("左键被抬起\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());
ui->label->setText(s);
}
else if(event->button() == Qt::RightButton)
{
QString s = QString("右键被抬起\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());
ui->label->setText(s);
}
else if(event->button() == Qt::MiddleButton)
{
QString s = QString("中间键被抬起\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());
ui->label->setText(s);
}
}
//鼠标双击重写事件函数的实现
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
QString s = QString("左键被双击\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());
ui->label->setText(s);
}
else if(event->button() == Qt::RightButton)
{
QString s = QString("右键被双击\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());
ui->label->setText(s);
}
else if(event->button() == Qt::MiddleButton)
{
QString s = QString("中间键被双击\n所在位置:x:%1,y:%2").arg(event->x()).arg(event->y());
ui->label->setText(s);
}
}
void Widget::mousePressEvent(QMouseEvent *event)
{
//p = event->globalPos()-this->frameGeometry().topLeft();
//鼠标点击全局位置 //窗口一开始位置
p=event->pos();
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() == Qt::LeftButton)
{
this->move(event->globalPos()-p);
//鼠标点击全局位置 鼠标相对于窗口的位置
}
}
示例 :
//绘制事件处理函数
void Widget::paintEvent(QPaintEvent *event)
{
// static int num = 0;
// qDebug() << ++num;
//实例化一个画家
QPainter p(this); //指定绘制地方
//给画家设置画笔
p.setPen(QColor("pink"));
//给画家的笔设置字体类型
p.setFont(QFont("宋体",40,10,false));
p.drawText(this->rect(),Qt::AlignCenter,"好好学习,天天向上");
//区域范围
}
#ifndef CLOCK_H
#define CLOCK_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Clock; }
QT_END_NAMESPACE
class Clock : public QWidget
{
Q_OBJECT
public:
Clock(QWidget *parent = nullptr);
~Clock();
void timerEvent(QTimerEvent *event) override;
signals:
void speak();
private slots:
void timeOut_solt();
void speak_slot();
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
private:
Ui::Clock *ui;
QDateTime sys_date;
QTimer *sys_time,*t;
int tid;
QPoint p;
QTextToSpeech *speecher;
};
#endif // CLOCK_H
#include "clock.h"
#include "ui_clock.h"
Clock::Clock(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Clock)
{
ui->setupUi(this);
// 设置窗口为纯净模式
this->setWindowFlags(Qt::FramelessWindowHint);
// 直接先初始化当前时间
tid = startTimer(1000);
sys_time = new QTimer(this);
speecher = new QTextToSpeech(this);
// 初始化t
t = new QTimer(this);
// 连接超时信号与处理的槽函数
connect(t, &QTimer::timeout, this, &Clock::timeOut_solt);
}
Clock::~Clock()
{
killTimer(tid);
delete ui;
}
void Clock::timerEvent(QTimerEvent *event)
{
if(event->timerId() == tid){
sys_date = QDateTime::currentDateTime();
ui->nowTimeLab->setText(sys_date.toString("yyyy-MM-dd HH:mm:ss"));
ui->nowTimeLab->setAlignment(Qt::AlignCenter);
}
}
void Clock::timeOut_solt()
{
QTime the_time = QTime::currentTime();
// 时间超过则直接发送语音播报信号
if(the_time.toString("hh:mm:ss") >= ui->clockTimeEdit->toPlainText()){
emit speak();
}
}
// 语音播报
void Clock::speak_slot()
{
speecher->say(ui->textEdit->toPlainText());
}
void Clock::mousePressEvent(QMouseEvent *event)
{
p = event->pos();
if(event->button() == Qt::LeftButton){
// 鼠标按下位置在 关闭上
if(p.x() >= ui->closeLab->x() && p.x() <= ui->closeLab->x()+ui->closeLab->width() \
&& p.y() >= ui->closeLab->y() && p.y() <= ui->closeLab->y()+ui->closeLab->height()){
// 按下关闭,关闭变红
ui->closeLab->setStyleSheet("background-color:red");
}
// 鼠标按下位置在 打开上
else if (p.x() >= ui->openLab->x() && p.x() <= ui->openLab->x()+ui->openLab->width() \
&& p.y() >= ui->openLab->y() && p.y() <= ui->openLab->y()+ui->openLab->height()){
}
}
}
void Clock::mouseReleaseEvent(QMouseEvent *event)
{
p = event->pos();
if(event->button() == Qt::LeftButton){
// 鼠标松开位置在 关闭上
if(p.x() >= ui->closeLab->x() && p.x() <= ui->closeLab->x()+ui->closeLab->width() \
&& p.y() >= ui->closeLab->y() && p.y() <= ui->closeLab->y()+ui->closeLab->height()){
// 松开关闭
t->stop();
ui->openLab->setStyleSheet("background-color:white");
ui->openLab->setText("启动闹钟");
ui->closeLab->setStyleSheet("background-color:white");
disconnect(this, &Clock::speak, this, &Clock::speak_slot);
}
// 鼠标松开位置在 打开上
else if (p.x() >= ui->openLab->x() && p.x() <= ui->openLab->x()+ui->openLab->width() \
&& p.y() >= ui->openLab->y() && p.y() <= ui->openLab->y()+ui->openLab->height()){
// 松开打开
t->start(3000);
ui->openLab->setText("已启动");
ui->openLab->setStyleSheet("background-color:green");
// 将语音播报信号和语音播报槽函数连接
connect(this, &Clock::speak, this, &Clock::speak_slot);
}
}
}
#include "clock.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Clock w;
w.show();
return a.exec();
}