Qt 界面点击关闭按钮隐藏起来,再次进入页面恢复上次状态

本文介绍了如何实现 Qt 界面点击关闭按钮隐藏起来,等到再次进入这个页面,页面上的内容为上次更改的状态。代码示例展示了如何使用 'showEvent' 和 'hideEvent' 函数来加载和保存上次更改的状态,并使用数据库来持久化保存数据。

1. 代码实现

#ifndef CONTROLFORM_H
#define CONTROLFORM_H

#include <QWidget>

namespace Ui {
class ControlForm;
}

class ControlForm : public QWidget
{
    Q_OBJECT

public:
    explicit ControlForm(QWidget *parent = nullptr);
    ~ControlForm();
    int getValue() const ;

private:
    Ui::ControlForm *ui;

public slots:
    void setValue(int value);
};

#endif // CONTROLFORM_H
#include "controlform.h"
#include "ui_controlform.h"

ControlForm::ControlForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ControlForm)
{
    ui->setupUi(this);
}

ControlForm::~ControlForm()
{
    delete ui;
}


int ControlForm::getValue()const
{
     return ui->spinBox->value();
}

void ControlForm::setValue(int value)
{
    ui->spinBox->setValue(value);
}
#ifndef LIGHTS_H
#define LIGHTS_H

#include <QWidget>

namespace Ui {
class Lights;
}

class Lights : public QWidget
{
    Q_OBJECT

public:
    explicit Lights(int userid,QWidget *parent = nullptr);
    ~Lights();
    void lightsWidget();

public slots:
    bool switchButton_status(bool checked);
    void showEvent(QShowEvent *event);
    void hideEvent(QHideEvent *event);
    void loadLastStatus();
    void saveLastStatus();

private:
    Ui::Lights *ui;
    int userid;
    bool flag = false;

    void closeEvent(QCloseEvent *event);
    QString getLastBrightness(int userid);
    void updateLastBrightness(int userid, QString brightness);

};

#endif // LIGHTS_H
#include "lights.h"
#include "ui_lights.h"
#include "switchform.h"
#include "sqlite.h"
#include <QSqlQuery>
#include <QSqlDatabase>
#include <QSqlError>
#include <QMessageBox>
#include <QCloseEvent>
#include <QDebug>

Lights::Lights(int userid,QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Lights)
{
    ui->setupUi(this);
    lightsWidget();
    connect(ui->SwitchStatus,&SwitchForm::statusChanged,this,&Lights::switchButton_status);
    connect(ui->Finished, &QPushButton::clicked, this,[=]{
        if(flag)
        {
            QString brighteness = QString::number(ui->ctrlform->getValue());
            qDebug()<<brighteness;
            updateSmartHomeStatus(userid,QString("智能灯"),QString("开启"),brighteness);
        }else
        {
            QMessageBox::information(this,"提示","智能灯未打开!");
            qDebug() << "智能灯未打开!";
            updateSmartHomeStatus(userid,QString("智能灯"),QString("关闭"),QString("0"));
        }
    });
    loadLastStatus();
}

Lights::~Lights()
{
    delete ui;
}

void Lights::lightsWidget()
{
    setWindowTitle("智能灯设置");
    setAutoFillBackground(true);
    QPalette palette = this->palette();
    QPixmap pixmap(":/user/image/image/light.jpg");
    palette.setBrush(QPalette::Window, QBrush(pixmap));
    setPalette(palette);
    setFixedSize(600,400);
}

bool Lights::switchButton_status(bool checked)
{
    qDebug()<<checked;
    flag = checked;
    return flag;
}

void Lights::showEvent(QShowEvent *event)
{
    loadLastStatus();
    event->accept();
}

void Lights::hideEvent(QHideEvent *event)
{
    saveLastStatus();
    event->accept();
}

void Lights::closeEvent(QCloseEvent *event)
{
    hide();
    event->ignore();
}

void Lights::loadLastStatus()
{
    QString brightness = getLastBrightness(userid);
    if (brightness.toInt() > 0)
    {
        ui->SwitchStatus->setChecked(true);
        ui->ctrlform->setValue(brightness.toInt());
    }
    else
    {
        ui->SwitchStatus->setChecked(false);
        ui->ctrlform->setValue(0);
    }
}

void Lights::saveLastStatus()
{
    QString brightness = QString::number(ui->ctrlform->getValue());
    updateLastBrightness(userid, brightness);
}

QString Lights::getLastBrightness(int userid)
{
    Sqlite::sqlite_init();
    QString queryStr = QString("SELECT value FROM Status WHERE uid = %1 AND device_name = '智能灯'").arg(userid);
    QSqlQuery query;
    if (query.exec(queryStr) && query.next())
    {
        return query.value(0).toString();
    }
    else
    {
        qDebug() << "得到上一次亮度错误: " << query.lastError().text();
        return "";
    }
}

void Lights::updateLastBrightness(int userid, QString brightness)
{
    Sqlite::sqlite_init();
    QString queryStr = QString("UPDATE Status SET value = '%1' WHERE uid = %2 AND device_name = '智能灯'").arg(brightness).arg(userid);
    QSqlQuery query;
    if (!query.exec(queryStr))
    {
        qDebug() << "更新亮度失败: " << query.lastError().text();
    }
}

2. 代码解释

  • ControlForm 类: 用于控制智能灯亮度,包含一个 SpinBox 和一个 Slider,用于设置亮度值。
  • Lights 类: 用于显示智能灯设置界面,包含一个开关按钮(SwitchStatus)和一个确认按钮(Finished)。
  • showEvent 函数: 在窗口显示时,调用 loadLastStatus 函数加载上次更改的状态。
  • hideEvent 函数: 在窗口隐藏时,调用 saveLastStatus 函数保存当前更改的状态。
  • loadLastStatus 函数: 从数据库中读取上次更改的亮度值,并设置 SpinBox 和 Slider 的值。
  • saveLastStatus 函数: 将当前 SpinBox 的值保存到数据库中。

3. 总结

通过以上代码,我们可以实现 Qt 界面点击关闭按钮隐藏起来,等到再次进入这个页面,页面上的内容为上次更改的状态。该实现使用 'showEvent' 和 'hideEvent' 函数来加载和保存上次更改的状态,并使用数据库来持久化保存数据。

希望本文对你有所帮助!

Qt 界面点击关闭按钮隐藏起来,再次进入页面恢复上次状态

原文地址: http://www.cveoy.top/t/topic/fAPE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录