学习笔记
牛客刷题
闹钟
时钟显示 通过
QTimer
每秒更新一次QLCDNumber
显示的当前时间,格式为hh:mm:ss
,实现实时时钟显示。闹钟设置
- 使用
QDateTimeEdit
让用户设置闹钟时间,可通过日历选择日期,设置范围为当前时间到未来 10 天。
- 提醒功能
- 语音播报:当到达设定的闹钟时间,从
QPlainTextEdit
获取文本,利用QTextToSpeech
进行语音播报。- 音效播放:同时,使用
QMediaPlayer
播放指定的提醒音效文件123.mp3
,音量设为 80。
- 控制操作
- 启动闹钟:点击“启动”按钮,开启定时器进行时间检查,此时“启动”按钮禁用,“停止”按钮启用。
- 停止闹钟:点击“停止”按钮,停止定时器和音效播放,“启动”按钮重新启用,“停止”按钮禁用。
#include "widget.h"
#include "ui_widget.h"
#include<QTime>
#include<QDateTime>
#include<QTextToSpeech>
#include<QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建时钟
timerTime=new QTimer(this);
timerClock=new QTimer(this);
//绑定时钟函数
connect(timerTime,&QTimer::timeout,this,&Widget::timeSlot);
connect(timerClock,&QTimer::timeout,this,&Widget::clockSlot);
//时钟直接启动
timerTime->start(1000);
ui->timeLCD->setDigitCount(8);
ui->dateTimeEdit->setCalendarPopup(true);
ui->dateTimeEdit->setMinimumDateTime(QDateTime::currentDateTime());
ui->dateTimeEdit->setMaximumDate(QDate::currentDate().addDays(10));
ui->dateTimeEdit->setDisplayFormat("yyyy-MM-dd hh:mm:ss");
speech=new QTextToSpeech(this);
startSound=new QMediaPlayer(this);
startSound->setMedia(QUrl("qrc:/new/prefix1/123.mp3"));
startSound->setVolume(80); //音量
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_startBtn_clicked()
{
//计时器启动
this->timerClock->start(1000);
ui->startBtn->setEnabled(false);
ui->endBtn->setEnabled(true);
}
void Widget::on_endBtn_clicked()
{
// 取消
this->timerClock->stop();
startSound->stop();
ui->startBtn->setEnabled(true);
ui->endBtn->setEnabled(false);
}
//时钟增加函数
void Widget::timeSlot()
{
QTime time;
ui->timeLCD->display(time.currentTime().toString("hh:mm:ss"));
}
//闹钟函数
void Widget::clockSlot()
{
QDateTime dt=ui->dateTimeEdit->dateTime();
// QDateTime now;
if(dt.secsTo(QDateTime::currentDateTime())==0){
//播报
QString text=ui->plainTextEdit->toPlainText();
speech->say(text);
ui->startBtn->setEnabled(true);
timerClock->stop();
startSound->play();
}
}
学习笔记
一、QObject::event
- 函数名:
bool QObject::event(QEvent *e)
- 函数功能:这是Qt事件处理的入口函数。当一个事件发生时,首先会调用该函数。它会根据传入的事件对象
e
,识别事件类型,然后进行初步处理或分发到更具体的事件处理函数。比如,它可以判断事件是鼠标事件、键盘事件还是其他类型事件,进而决定后续处理流程。 - 函数参数:
QEvent *e
,这是一个指向QEvent
对象的指针。QEvent
是所有事件类的基类,通过它可以获取事件的详细信息,如事件类型、发生时间等。 - 函数返回值:
bool
类型。如果事件被成功处理,返回true
;若未处理或需要进一步处理,则返回false
。返回值会影响事件的后续传递,如果返回false
,事件可能会继续向上传递给父对象处理。 - 主要函数举例:
class MyObject : public QObject {
Q_OBJECT
public:
bool event(QEvent *e) override {
if (e->type() == QEvent::MouseButtonPress) {
qDebug() << "Mouse button pressed event caught in event()";
return true;
}
return QObject::event(e);
}
};
在这个例子中,MyObject
类继承自QObject
并重写了event
函数。当检测到鼠标按下事件时,输出相应信息并返回true
,表示事件已处理;否则,调用父类的event
函数继续处理事件。
二、QWidget的鼠标事件处理函数
(一)mousePressEvent
- 函数名:
void QWidget::mousePressEvent(QMouseEvent *event)
- 函数功能:当鼠标按键在部件上按下时被调用。常用于记录鼠标按下的位置,为后续的绘图、拖曳等操作做准备。
- 函数参数:
QMouseEvent *event
,通过它可以获取鼠标事件的详细信息,包括按下的是哪个鼠标按键(如Qt::LeftButton
、Qt::RightButton
等),鼠标在部件上的位置(相对于部件的坐标pos()
)以及在屏幕上的全局坐标(globalPos()
)等。 - 函数返回值:
void
,没有返回值,专注于处理鼠标按下事件的相关逻辑。 - 主要函数举例:
class MyWidget : public QWidget {
Q_OBJECT
public:
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
qDebug() << "Left mouse button pressed at local position:" << event->pos();
} else if (event->button() == Qt::RightButton) {
qDebug() << "Right mouse button pressed at global position:" << event->globalPos();
}
}
};
在这个示例中,MyWidget
类重写了mousePressEvent
函数,根据按下的鼠标按键不同,输出相应的位置信息。
(二)mouseReleaseEvent
- 函数名:
void QWidget::mouseReleaseEvent(QMouseEvent *event)
- 函数功能:在鼠标按键在部件上释放时被调用。常与
mousePressEvent
配合使用,完成一些与鼠标操作相关的功能,比如在绘图应用中,鼠标按下时开始绘制,释放时结束绘制。 - 函数参数:
QMouseEvent *event
,包含鼠标释放事件的详细信息,与mousePressEvent
中的参数类似。 - 函数返回值:
void
,没有返回值,主要用于处理鼠标释放后的相关操作。 - 主要函数举例:
class MyWidget : public QWidget {
Q_OBJECT
QPoint pressPos;
public:
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
pressPos = event->pos();
}
}
void mouseReleaseEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
QPoint releasePos = event->pos();
int distance = (releasePos - pressPos).manhattanLength();
qDebug() << "Mouse dragged for a distance of:" << distance;
}
}
};
此例中,MyWidget
类在mousePressEvent
中记录鼠标按下的位置,在mouseReleaseEvent
中计算鼠标拖动的距离并输出。
(三)mouseDoubleClickEvent
- 函数名:
void QWidget::mouseDoubleClickEvent(QMouseEvent *event)
- 函数功能:当鼠标在部件上双击时被调用。通常用于实现一些特殊的交互功能,如双击打开文件、放大视图等。
- 函数参数:
QMouseEvent *event
,可获取双击事件的相关信息,如双击的位置、按键等。 - 函数返回值:
void
,没有返回值,用于执行双击事件对应的操作。 - 主要函数举例:
class MyWidget : public QWidget {
Q_OBJECT
public:
void mouseDoubleClickEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
qDebug() << "Left mouse button double - clicked at:" << event->pos();
}
}
};
在这个示例中,当鼠标左键在MyWidget
上双击时,输出双击的位置信息。
(四)mouseMoveEvent
- 函数名:
void QWidget::mouseMoveEvent(QMouseEvent *event)
- 函数功能:当鼠标在部件上移动时被调用。常用于实现实时响应鼠标移动的功能,如在绘图软件中实时绘制线条,或在游戏中根据鼠标移动控制角色方向。
- 函数参数:
QMouseEvent *event
,通过它可以获取鼠标移动的详细信息,包括当前鼠标位置(pos()
)、移动过程中按下的按键(buttons()
)等。 - 函数返回值:
void
,没有返回值,专注于处理鼠标移动相关逻辑。 - 主要函数举例:
class MyWidget : public QWidget {
Q_OBJECT
public:
void mouseMoveEvent(QMouseEvent *event) override {
if (event->buttons() & Qt::LeftButton) {
qDebug() << "Mouse is being dragged with left button at:" << event->pos();
}
}
};
在这个例子中,当鼠标左键被按下并移动时,输出鼠标的当前位置信息。
三、QWidget的键盘事件处理函数
(一)keyPressEvent
- 函数名:
void QWidget::keyPressEvent(QKeyEvent *event)
- 函数功能:在键盘按键被按下时被调用。常用于实现各种键盘控制功能,如在游戏中通过键盘控制角色移动,在文本编辑器中处理按键输入等。
- 函数参数:
QKeyEvent *event
,通过它可以获取按下按键的详细信息,如按键的键值(key()
,用于识别具体按键)、本次事件中使用的键的个数(count()
)以及键上的文本内容(text()
)等。 - 函数返回值:
void
,没有返回值,主要用于执行键盘按下事件对应的操作。 - 主要函数举例:
class MyWidget : public QWidget {
Q_OBJECT
public:
void keyPressEvent(QKeyEvent *event) override {
if (event->key() == Qt::Key_A) {
qDebug() << "The 'A' key was pressed";
} else if (event->key() == Qt::Key_Up) {
qDebug() << "The up arrow key was pressed";
}
}
};
在此例中,MyWidget
类重写了keyPressEvent
函数,根据按下的不同按键输出相应信息。
(二)keyReleaseEvent
- 函数名:
void QWidget::keyReleaseEvent(QKeyEvent *event)
- 函数功能:当键盘按键被释放时被调用。可用于处理与按键释放相关的逻辑,如在一些需要长按按键触发特殊功能的场景中,按键释放时结束该功能。
- 函数参数:
QKeyEvent *event
,包含按键释放事件的详细信息,与keyPressEvent
中的参数类似。 - 函数返回值:
void
,没有返回值,专注于处理按键释放后的操作。 - 主要函数举例:
class MyWidget : public QWidget {
Q_OBJECT
bool isCtrlPressed = false;
public:
void keyPressEvent(QKeyEvent *event) override {
if (event->key() == Qt::Key_Control) {
isCtrlPressed = true;
}
}
void keyReleaseEvent(QKeyEvent *event) override {
if (event->key() == Qt::Key_Control) {
isCtrlPressed = false;
qDebug() << "Ctrl key released";
}
}
};
在这个示例中,MyWidget
类通过keyPressEvent
和keyReleaseEvent
函数记录Ctrl
键的按下和释放状态,并在Ctrl
键释放时输出相应信息。
四、QWidget的定时器事件处理函数
- 函数名:
void QWidget::timerEvent(QTimerEvent *event)
- 函数功能:当定时器超时时被调用。在基于事件处理函数版本的定时器实现中,通过重写该函数来定义定时器超时后执行的操作,比如定时更新界面显示的时间、定时检查网络连接状态等。
- 函数参数:
QTimerEvent *event
,通过它可以获取定时器的相关信息,如定时器的ID号(timerId()
),用于区分不同的定时器(当存在多个定时器时)。 - 函数返回值:
void
,没有返回值,主要用于执行定时器超时后的操作。 - 主要函数举例:
class MyWidget : public QWidget {
Q_OBJECT
int timerId;
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
timerId = startTimer(1000); // 启动一个每秒触发一次的定时器
}
void timerEvent(QTimerEvent *event) override {
if (event->timerId() == timerId) {
qDebug() << "Timer timeout. Current time:" << QTime::currentTime();
}
}
};
在这个例子中,MyWidget
类启动了一个定时器,并在timerEvent
函数中处理定时器超时事件,输出当前时间。
五、QWidget的绘制事件处理函数
- 函数名:
void QWidget::paintEvent(QPaintEvent *event)
- 函数功能:用于处理绘制事件,当窗口需要重新绘制时(如窗口大小改变、最小化后恢复、主动调用
repaint
或update
函数等情况),该函数会被自动调用。通常在这个函数中使用QPainter
类进行各种图形绘制操作,如绘制文本、矩形、椭圆等。 - 函数参数:
QPaintEvent *event
,包含了绘制事件的相关信息,虽然在实际绘制操作中可能较少直接使用,但它是绘制事件的标识。 - 函数返回值:
void
,主要负责执行绘制操作,没有返回值。 - 主要函数举例:
class MyWidget : public QWidget {
Q_OBJECT
public:
void paintEvent(QPaintEvent *event) override {
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 20));
painter.drawText(rect(), Qt::AlignCenter, "Hello, Qt!");
painter.drawRect(10, 10, width() - 20, height() - 20);
}
};
在这个示例中,MyWidget
类重写了paintEvent
函数,使用QPainter
在窗口中绘制了文本和矩形。