vs qt widget application 槽函数和信号

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();
}

你可能感兴趣的:(qt,qt,开发语言,c++)