1 slot 是对ui控件数据 读取或更新的函数
public slots:void startCountdown();void updateCountdown();
startCountdown 点击ui上的按钮,触发信号signal(按钮默认),执行slot,读取ui数据
updateCountdown 满足条件signal(默认信号),执行slot,更新ui数据
因为要操作ui上的数据所以 slots
2 singal 默认信号(Qt内置的信号)和自定义信号
2.1 默认信号 按钮/计时器 都是默认信号
ui 按钮 点击了 触发默认信号 执行slot startCountdown
connect(ui.startButton, &QPushButton::clicked, this, &countdown::startCountdown);
2.2 自定义信号
signals:void buttonClicked();
// 发射信号emit buttonClicked();
当满足自定义的条件时,触发信号,让指定的 槽函数slot对 ui数据/控件操作
connect(this, &MainWindow::buttonClicked, this, &MainWindow::handleButtonClicked);
3 总结
3.1 要操作ui 就被定义成slots
3.2 想要满足自定义条件 然后操作ui 就自定义信号 触发slot
4 例子
ui 界面
一个 QLabel 显示倒计时
三个 QSpinBox 设置倒计时 时 分 秒
一个 QButton 点击开始倒计时
.h
一个 点击ui 按钮后 读取 QSpinBox 数值的槽函数 (要操作ui)
一个 时刻更新ui QLabel显示时间的槽函数(要操作ui)
一个 成员函数 播放 闹钟声音(不要操作ui)
无自定义信号,除非想 自定义条件结束后 操作ui
.cpp
在构造函数中:
ui.setupUi(this); // 初始化并运行设计好的 UI
connect(ui.startButton, &QPushButton::clicked, this, &countdown::startCountdown);
connect(&countdownTimer, &QTimer::timeout, this, &countdown::updateCountdown);
构造函数的作用是初始化对象,并且可以在其中调用其他方法或函数,以便在对象创建时就让它们运行起来。
5 代码
.h
#pragma once#include <QtWidgets/QMainWindow>
#include <QObject>
#include <QTimer>
#include <QDebug>
#include "ui_countdown.h"class countdown : public QMainWindow
{Q_OBJECTpublic:countdown(QWidget *parent = nullptr);~countdown();public slots:void startCountdown();void updateCountdown();private:QTimer countdownTimer; //对象 成员变量可以是各种数据类型int totalSeconds;private:void countdownFinished();Ui::countdownClass ui;
};
.cpp
#include "countdown.h"
#include <QMultimedia>
#include <QSound> // 在qt vs tool -> qt pj setting 中添加 mulitmediacountdown::countdown(QWidget *parent): QMainWindow(parent)
{// 构造函数 初始化 项目运行逻辑ui.setupUi(this);// 创建一个字体对象,并设置字体大小为20QFont font;font.setPointSize(40);// 将字体应用于countdownLabelui.countdownLabel->setFont(font);connect(ui.startButton, &QPushButton::clicked, this, &countdown::startCountdown);// QT 内置信号 &QTimer::timeout 不用自定义信号connect(&countdownTimer, &QTimer::timeout, this, &countdown::updateCountdown);}countdown::~countdown()
{}void countdown::startCountdown()
{int hours = ui.hourSpinBox->value();int minutes = ui.minutesSpinBox->value();int seconds = ui.secondsSpinBox->value();totalSeconds = 0; // 类countdown 的成员函数 直接访问 自己的 成员(共有/私有)变量totalSeconds = hours * 3600 + minutes * 60 + seconds;countdownTimer.start(1000);
}void countdown::updateCountdown()
{if (totalSeconds > 0) {qDebug() << "totalSeconds" << totalSeconds;int hours = totalSeconds / 3600;int minutes = (totalSeconds % 3600) / 60;int seconds = totalSeconds % 60;QString time = QString("%1:%2:%3").arg(hours, 2, 10, QChar('0')).arg(minutes, 2, 10, QChar('0')).arg(seconds, 2, 10, QChar('0'));ui.countdownLabel->setText(time);totalSeconds--;}else {ui.countdownLabel->setText("00:00:00");countdownTimer.stop();countdown::countdownFinished();}
}void countdown::countdownFinished() {qDebug() << "sound start";QSound::play("Ring09.wav"); // 把wav 复制到项目文件夹下qDebug() << "sound end";}
main.cpp
#include "countdown.h"
#include <QtWidgets/QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);countdown w;w.show();return a.exec();
}