Qt 界面点击关闭按钮隐藏起来,再次进入页面恢复上次状态
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' 函数来加载和保存上次更改的状态,并使用数据库来持久化保存数据。
希望本文对你有所帮助!
原文地址: http://www.cveoy.top/t/topic/fAPE 著作权归作者所有。请勿转载和采集!