• QT DAY4


    一、使用鼠标时间完成组件的移动

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. QT_BEGIN_NAMESPACE
    7. namespace Ui { class Widget; }
    8. QT_END_NAMESPACE
    9. class Widget : public QWidget
    10. {
    11. Q_OBJECT
    12. public:
    13. Widget(QWidget *parent = nullptr);
    14. ~Widget();
    15. void mousePressEvent(QMouseEvent *event) override; //鼠标按下事件
    16. void mouseMoveEvent(QMouseEvent *event) override; //鼠标移动事件
    17. private:
    18. Ui::Widget *ui;
    19. QPoint drap; //定义Z向量
    20. };
    21. #endif // WIDGET_H
    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. //取消头部
    9. this->setWindowFlag(Qt::FramelessWindowHint);
    10. //qDebug()<geometry().topLeft();
    11. }
    12. Widget::~Widget()
    13. {
    14. delete ui;
    15. }
    16. //鼠标按下事件的实现
    17. void Widget::mousePressEvent(QMouseEvent *event)
    18. {
    19. qDebug()<<this->pos(); //是组件相对于整个屏幕的位置
    20. qDebug()<globalPos(); //是鼠标相对于整个屏幕的位置
    21. if(event->buttons() == Qt::LeftButton)
    22. {
    23. drap = event->globalPos() - this->pos(); //求出相对于屏幕坐标系中,组件左上角位置到鼠标位置的向量
    24. }else if(event->buttons() == Qt::RightButton)
    25. {
    26. this->close();
    27. }
    28. }
    29. //鼠标移动事件的实现
    30. void Widget::mouseMoveEvent(QMouseEvent *event)
    31. {
    32. this->move(event->globalPos() - drap); //将组件移动到新位置,由鼠标所在向量,减去组件左上角位置到鼠标位置的向量
    33. }

    二、定时器

    当定时器时间超时后,就会有相关的动作进行相应,一个qt程序可以定义多个定时器,以处理不同的事情

    定时器的实现有两种方式,分别是基于属性版本,和基于事件处理函数版本

    1> 基于属性版本的定时器(QTimer),本质上是基于信号与槽

    • 1、实例化一个QTimer类对象
    • 2、调用该类对象中的成员函数start(毫秒数),启动一个定时器,并给定所定时长,那么该定时器会每隔给定时长后,发射timeout的信号
    • 3、当时间超时后,那么该定时器就会自动发射一个timeout的信号
    • 4、我们可以将该信号连接到自定义的槽函数中,在槽函数中处理相关逻辑
    • 5、造成的现象是:每隔给定时长后,系统会自动调用槽函数
    • 6、当不用该定时器时,可以使用该类中的成员函数stop停止一个定时器

     

    2> 基于事件处理函数

    • 1、基于事件处理函数,无需引入新的类对象,使用的全部都是自己的成员函数
    • 2、调用自己的成员函数startTimer(毫秒数),启动一个定时器,启动之后,系统会每隔给定毫秒后,自动调用timerEvent函数
    • 3、timerEvent函数也是自己类中继承的相关虚函数,所以,要对该函数进行重写
    • 4、如果想要关闭定时器,只需调用自己的成员函数killTimer(定时器ID)
    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include //定时器类
    5. #include //时间类
    6. #include //定时器事件类头文件
    7. #include //日期时间类
    8. QT_BEGIN_NAMESPACE
    9. namespace Ui { class Widget; }
    10. QT_END_NAMESPACE
    11. class Widget : public QWidget
    12. {
    13. Q_OBJECT
    14. public:
    15. Widget(QWidget *parent = nullptr);
    16. ~Widget();
    17. //重写定时器事件处理函数
    18. void timerEvent(QTimerEvent *event)override;
    19. private slots:
    20. void on_objStartBtn_clicked();
    21. void timeout_slot(); //自定义处理timeout信号函数的声明
    22. void on_eventStartBtn_clicked();
    23. private:
    24. Ui::Widget *ui;
    25. //实例化一个定时器指针。基于类对象版本的定时器
    26. QTimer *timer;
    27. //定义一个定时器的id
    28. int timer_id; //基于事件处理函数的定时器
    29. };
    30. #endif // WIDGET_H

    三、绘制事件

    QT界面运行时主要调用了绘制事件,将图形化界面绘制在计算机上

    而绘制事件中调用时机是:第一次展示窗口、窗口因最大化、最小化恢复正常状态、窗口因被覆盖后再次暴露、更改窗口大小、调用update函数都会调用绘制事件

    实现闹钟

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. Widget::Widget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Widget)
    6. {
    7. ui->setupUi(this);
    8. timer = new QTimer(this);
    9. speecher = new QTextToSpeech(this);
    10. // 初始化组件状态
    11. ui->dateTimeEdit->setEnabled(true);
    12. ui->action->setEnabled(true);
    13. ui->stop->setEnabled(false);
    14. ui->CurrentTime->setEnabled(false);
    15. ui->edit1->setEnabled(true);
    16. // 连接信号和槽
    17. connect(timer, &QTimer::timeout, this, &Widget::timeout_slot);
    18. connect(ui->action, &QPushButton::clicked, this, &Widget::on_action_clicked);
    19. connect(ui->stop, &QPushButton::clicked, this, &Widget::on_stop_clicked);
    20. }
    21. Widget::~Widget()
    22. {
    23. delete ui;
    24. }
    25. void Widget::on_action_clicked()
    26. {
    27. // 启动定时器
    28. timer->start(1000);
    29. // 更新组件状态
    30. ui->dateTimeEdit->setEnabled(false);
    31. ui->action->setEnabled(false);
    32. ui->stop->setEnabled(true);
    33. ui->CurrentTime->setEnabled(true);
    34. ui->edit1->setEnabled(false);
    35. // 获取设定的时间
    36. alarmTime = ui->dateTimeEdit->dateTime();
    37. }
    38. void Widget::timeout_slot()
    39. {
    40. QDateTime currentDateTime = QDateTime::currentDateTime();
    41. QString t = currentDateTime.toString("yyyy-MM-dd hh:mm:ss");
    42. // 更新UI上的时间显示
    43. ui->CurrentTime->setText(t);
    44. // 检查是否到达设定的时间
    45. if (currentDateTime >= alarmTime) {
    46. // 播报文本
    47. speecher->say(ui->edit1->toPlainText());
    48. // 停止定时器
    49. timer->stop();
    50. // 更新组件状态
    51. ui->dateTimeEdit->setEnabled(true);
    52. ui->action->setEnabled(true);
    53. ui->stop->setEnabled(false);
    54. ui->CurrentTime->setEnabled(false);
    55. ui->edit1->setEnabled(true);
    56. }
    57. }
    58. void Widget::on_stop_clicked()
    59. {
    60. // 停止定时器
    61. timer->stop();
    62. // 更新组件状态
    63. ui->dateTimeEdit->setEnabled(true);
    64. ui->action->setEnabled(true);
    65. ui->stop->setEnabled(false);
    66. ui->CurrentTime->setEnabled(false);
    67. ui->edit1->setEnabled(true);
    68. }

     

  • 相关阅读:
    【管理运筹学】第 10 章 | 排队论(3,标准的 M/M/1 排队系统)
    OpenCV简介、OpenCV的发展历程
    使用FFmpeg合并多个ts视频文件转为mp4格式
    【JAVA】-- 简易超市管理系统(二)(实现思路+每步代码)
    如何确保电子的版权?目前,保护方式有哪些?
    mongodb开启副本集功能
    强制删除k8s中的命名空间为 Terminating 的ns
    如何用惯性动作捕捉系统,快速创建数字人三维动画?
    Abaqus在压力容器的应用
    SpringBoot+Vue项目疫情防控期间某村外出务工人员信息管理系统
  • 原文地址:https://blog.csdn.net/weixin_69028524/article/details/132654621