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
#include
#include
#include
#include "ui_countdown.h"
class countdown : public QMainWindow
{
Q_OBJECT
public:
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
#include // 在qt vs tool -> qt pj setting 中添加 mulitmedia
countdown::countdown(QWidget *parent)
: QMainWindow(parent)
{// 构造函数 初始化 项目运行逻辑
ui.setupUi(this);
// 创建一个字体对象,并设置字体大小为20
QFont font;
font.setPointSize(40);
// 将字体应用于countdownLabel
ui.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
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
countdown w;
w.show();
return a.exec();
}