{ "title": "#ifndef SWITCHFORM_H\n#define SWITCHFORM_H\n\n#include \n#include \n#include \n\nnamespace Ui {\nclass SwitchForm;\n}\n\nclass SwitchForm : public QWidget\n{\n Q_OBJECT\n\npublic:\n explicit SwitchForm(QWidget *parent = nullptr);\n\nsignals:\n void statusChanged(bool checked);\n\n\npublic slots:\n void updateValue();\n\nprivate:\n void drawBackGround(QPainter *painter);\n void drawSlider(QPainter *painter);\n\nprotected:\n void paintEvent(QPaintEvent *ev);\n void mousePressEvent(QMouseEvent *ev);\n\nprivate:\n\n int m_space; //滑块距离边界距离\n int m_radius; //圆角角度\n\n bool m_checked; //是否选中\n bool m_showText; //是否显示文字\n bool m_showCircle; //是否显示圆圈\n bool m_animation; //是否使用动画\n\n QColor m_bgColorOn; //打开时候的背景色\n QColor m_bgColorOff; //关闭时候的背景色\n QColor m_sliderColorOn; //打开时候滑块颜色\n QColor m_sliderColorOff; //关闭时候滑块颜色\n QColor m_textColor; //文字颜色\n\n QString m_textOn; //打开时候的文字\n QString m_textOff; //关闭时候的文字\n\n QTimer *m_timer; //动画定时器\n int m_step; //动画步长\n int m_startX; //滑块开始X轴坐标\n int m_endX; //滑块结束X轴坐标\n\npublic:\n int space() const;\n int radius() const;\n bool checked() const;\n bool showText() const;\n bool showCircel() const;\n bool animation() const;\n\n QColor bgColorOn() const;\n QColor bgColorOff() const;\n QColor sliderColorOn() const;\n QColor sliderColorOff() const;\n QColor textColor() const;\n\n QString textOn() const;\n QString textOff() const;\n\n int step() const;\n int startX() const;\n int endX() const;\n\npublic Q_SLOTS:\n void setSpace(int space);\n void setRadius(int radius);\n void setChecked(bool checked);\n void setShowText(bool show);\n void setShowCircle(bool show);\n void setAnimation(bool ok);\n\n void setBgColorOn(const QColor &color);\n void setBgColorOff(const QColor &color);\n void setSliderColorOn(const QColor &color);\n void setSliderColorOff(const QColor &color);\n void setTextColor(const QColor &color);\n\n void setTextOn(const QString &text);\n void setTextOff(const QString &text);\npublic slots:\n bool getstate();\n\n};\n\nboolean getStatus();\n\n#endif // SWITCHFORM_H\n\n\n#include "switchform.h"\n#include "ui_switchform.h"\n#include \n\nSwitchForm::SwitchForm(QWidget *parent) :\n QWidget(parent)\n{\n m_space = 2;\n m_radius = 5;\n m_checked = false;\n m_showText = true;\n m_showText = false;\n m_animation = true;\n\n m_bgColorOn = QColor(102, 205, 170);//设置按钮内部颜色\n m_bgColorOff = QColor(190, 190, 190);\n\n m_sliderColorOn = QColor(255, 255, 255);\n m_sliderColorOff = QColor(255, 255, 255);\n\n m_textColor = QColor(255, 255, 255);\n\n m_textOn = "开启"//设置按钮中的文字\n m_textOff = "关闭";\n\n m_step = 0;\n m_startX = 0;\n m_endX = 0;\n\n m_timer = new QTimer(this);\n m_timer->setInterval(30);\n connect(m_timer, SIGNAL(timeout()), this, SLOT(updateValue()));\n}\n\nvoid SwitchForm::drawBackGround(QPainter *painter)\n{\n painter->save();\n painter->setPen(Qt::NoPen);\n\n QColor bgColor = m_checked ? m_bgColorOn : m_bgColorOff;\n if (isEnabled()) {\n bgColor.setAlpha(150);\n }\n\n painter->setBrush(bgColor);\n\n QRect rect(0, 0, width(), height());\n int side = qMin(width(), height());\n\n //左侧半圆\n QPainterPath path1;\n path1.addEllipse(rect.x(), rect.y(), side, side);\n\n //右侧半圆\n QPainterPath path2;\n path2.addEllipse(rect.width() - side, rect.y(), side, side);\n\n //中间的矩形\n QPainterPath path3;\n path3.addRect(rect.x() + side / 2, rect.y(), rect.width() - side, height());\n\n QPainterPath path = path1 + path2 + path3;\n painter->drawPath(path);\n\n //绘制文本\n\n //滑块半径\n int sliderWidth = qMin(height(), width()) - m_space * 2 - 5;\n if (m_checked){\n QRect textRect(0, 0, width() - sliderWidth, height());\n painter->setPen(QPen(m_textColor));\n painter->drawText(textRect, Qt::AlignCenter, m_textOn);\n } else {\n QRect textRect(sliderWidth, 0, width() - sliderWidth, height());\n painter->setPen(QPen(m_textColor));\n painter->drawText(textRect, Qt::AlignCenter, m_textOff);\n }\n\n painter->restore();\n}\n\nvoid SwitchForm::drawSlider(QPainter *painter)\n{\n painter->save();\n painter->setPen(Qt::NoPen);\n\n QColor color = m_checked ? m_sliderColorOn : m_sliderColorOff;\n\n painter->setBrush(QBrush(color));\n\n int sliderWidth = qMin(width(), height()) - m_space * 2;\n int sliderX = m_checked ? width() - sliderWidth - m_space : m_space; // 修改滑块的X轴坐标\n QRect rect(sliderX, m_space, sliderWidth, sliderWidth);\n painter->drawEllipse(rect);\n\n painter->restore();\n}\n\nvoid SwitchForm::paintEvent(QPaintEvent *ev)\n{\n //启用反锯齿\n QPainter painter(this);\n painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);\n\n //绘制背景\n drawBackGround(&painter);\n\n //绘制滑块\n drawSlider(&painter);\n}\n\n\nvoid SwitchForm::mousePressEvent(QMouseEvent *ev)\n{\n Q_UNUSED(ev)\n\n setChecked(!m_checked); // 更新状态\n emit statusChanged(m_checked);\n\n // 计算步长\n m_step = qAbs(m_endX - m_startX) / 10; // 修改步长的计算方式\n\n // 判断是否使用动画\n if (m_animation) {\n m_timer->start();\n } else {\n m_startX = m_endX;\n update();\n }\n}\n\nvoid SwitchForm::updateValue()\n{\n if (m_checked) {\n if (m_startX < m_endX) {\n m_startX += m_step;\n } else {\n m_startX = m_endX;\n m_timer->stop();\n }\n } else {\n if (m_startX > m_endX) {\n m_startX -= m_step;\n } else {\n m_startX = m_endX;\n m_timer->stop();\n }\n }\n\n update();\n}\n\nint SwitchForm::space() const\n{\n return m_space;\n}\n\nbool SwitchForm::checked() const\n{\n return m_checked;\n}\n\nbool SwitchForm::showText() const\n{\n return m_showText;\n}\n\nbool SwitchForm::showCircel() const\n{\n return m_showCircle;\n}\n\nbool SwitchForm::animation() const\n{\n return m_animation;\n}\n\nQColor SwitchForm::bgColorOn() const\n{\n return m_bgColorOn;\n}\n\nQColor SwitchForm::bgColorOff() const\n{\n return m_bgColorOff;\n}\n\nQColor SwitchForm::sliderColorOn() const\n{\n return m_sliderColorOn;\n}\n\nQColor SwitchForm::sliderColorOff() const\n{\n return m_sliderColorOff;\n}\n\nQColor SwitchForm::textColor() const\n{\n return m_textColor;\n}\n\nQString SwitchForm::textOn() const\n{\n return m_textOn;\n}\n\nQString SwitchForm::textOff() const\n{\n return m_textOff;\n}\n\nint SwitchForm::step() const\n{\n return m_step;\n}\n\nint SwitchForm::startX() const\n{\n return m_startX;\n}\n\nint SwitchForm::endX() const\n{\n return m_endX;\n}\n\nvoid SwitchForm::setSpace(int space)\n{\n if (m_space != space) {\n m_space = space;\n update();\n }\n}\n\nvoid SwitchForm::setRadius(int radius)\n{\n if (m_radius != radius) {\n m_radius = radius;\n update();\n }\n}\n\nvoid SwitchForm::setChecked(bool checked)\n{\n if (m_checked != checked) {\n m_checked = checked;\n update();\n }\n}\n\nvoid SwitchForm::setShowText(bool show)\n{\n if (m_showText != show) {\n m_showText = show;\n update();\n }\n}\n\nvoid SwitchForm::setShowCircle(bool show)\n{\n if (m_showCircle != show) {\n m_showCircle = show;\n update();\n }\n}\n\nvoid SwitchForm::setAnimation(bool ok)\n{\n if (m_animation != ok) {\n m_animation = ok;\n update();\n }\n}\n\nvoid SwitchForm::setBgColorOn(const QColor &color)\n{\n if (m_bgColorOn != color) {\n m_bgColorOn = color;\n update();\n }\n}\n\nvoid SwitchForm::setBgColorOff(const QColor &color)\n{\n if (m_bgColorOff != color) {\n m_bgColorOff = color;\n update();\n }\n}\n\nvoid SwitchForm::setSliderColorOn(const QColor &color)\n{\n if (m_sliderColorOn != color) {\n m_sliderColorOn = color;\n update();\n }\n}\n\nvoid SwitchForm::setSliderColorOff(const QColor &color)\n{\n if (m_sliderColorOff != color) {\n m_sliderColorOff = color;\n update();\n }\n}\n\nvoid SwitchForm::setTextColor(const QColor &color)\n{\n if (m_textColor != color) {\n m_textColor = color;\n update();\n }\n}\n\nvoid SwitchForm::setTextOn(const QString &text)\n{\n if (m_textOn != text) {\n m_textOn = text;\n update();\n }\n}\n\nvoid SwitchForm::setTextOff(const QString &text)\n{\n if (m_textOff != text) {\n m_textOff = text;\n update();\n }\n}\n\nbool SwitchForm::getstate()\n{\n return m_checked;\n}\n\n\n#include "lights.h"\n#include "ui_lights.h"\n#include "switchform.h"\n#include "sqlite.h"\n#include \n#include \n#include \n#include \n#include \n\nLights::Lights(int userid,QWidget *parent) :\n QWidget(parent),\n ui(new Ui::Lights),\n userid(userid) //保证userid无变化\n{\n ui->setupUi(this);\n lightsWidget();\n //连接开关组件的信号和自定义的槽函数\n connect(ui->SwitchStatus,&SwitchForm::statusChanged,this,&Lights::switchButton_status);\n\n // 连接完成按钮的clicked信号和自定义的槽函数\n connect(ui->Finished, &QPushButton::clicked, this,[=]{\n if(flag)\n {\n QString brighteness = QString::number(ui->ctrlform->getValue());\n qDebug()<<brighteness<<userid;\n updateSmartHomeStatus(userid,QString("智能灯"),QString("开启"),brighteness);\n }else\n {\n qDebug() << "智能灯未打开!";\n updateSmartHomeStatus(userid,QString("智能灯"),QString("关闭"),QString("0"));\n }\n });\n // 加载上次更改的状态\n loadLastStatus();\n\n\n}\n\nLights::~Lights()\n{\n delete ui;\n}\n\nvoid Lights::lightsWidget()\n{\n setWindowTitle("智能灯设置");\n //设置ui组件背景\n setAutoFillBackground(true);\n QPalette palette=this->palette();\n QPixmap pixmap(":/user/image/image/light.jpg");\n palette.setBrush(QPalette::Window, QBrush(pixmap));\n setPalette(palette);\n setFixedSize(600,400);\n}\n\nQ_SLOT bool Lights::switchButton_status(bool checked)\n{\n qDebug()<<checked;\n flag=checked;\n if (checked) {\n ui->ctrlform->setEnabled(true);\n } else {\n ui->ctrlform->setEnabled(false);\n }\n return flag;\n}\n\nvoid Lights::showEvent(QShowEvent *event)\n{\n // 当页面显示时,加载上次更改的状态\n loadLastStatus();\n event->accept();\n}\n\nvoid Lights::hideEvent(QHideEvent *event)\n{\n saveLastStatus();\n event->accept();\n}\n\nvoid Lights::closeEvent(QCloseEvent *event)\n{\n // 隐藏窗口而不是关闭\n hide();\n event->ignore();\n}\n\nvoid Lights::loadLastStatus()\n{\n qDebug()<userid;\n QString state =getLastState(this->userid);\n QString brightness = getLastBrightness(this->userid);\n qDebug() << "1"<<state;\n if (state=="开启")\n {\n ui->SwitchStatus->setChecked(true);\n ui->ctrlform->setEnabled(true);\n ui->ctrlform->setValue(brightness.toInt());\n }\n else\n {\n ui->SwitchStatus->setChecked(false);\n ui->ctrlform->setEnabled(false);\n ui->ctrlform->setValue(0);\n }\n qDebug()<<brightness.toInt();\n}\n\nvoid Lights::saveLastStatus()\n{\n qDebug()<flag;\n QString status=QString(ui->SwitchStatus->getstate());\n QString brightness = QString::number(ui->ctrlform->getValue());\n updateLastBrightness(this->userid, brightness, status);\n}\n\n\nQString Lights::getLastBrightness(int userid)\n{\n Sqlite::sqlite_init();\n QString queryStr = QString("SELECT value FROM Status WHERE uid = %1 AND device_name = '智能灯' ORDER BY sid DESC LIMIT 1").arg(userid);\n qDebug()<<queryStr<<userid;\n QSqlQuery query;\n qDebug ()<<query.exec(queryStr);\n if (query.exec(queryStr) && query.next())\n {\n return query.value(0).toString();\n }\n else\n {\n qDebug() << "得到上一次亮度错误: " << query.lastError().text();\n return "";\n }\n}\n\nQString Lights::getLastState(int userid)\n{\n Sqlite::sqlite_init();\n QString queryStr = QString("SELECT device_state FROM Status WHERE uid = %1 AND device_name = '智能灯' ORDER BY sid DESC LIMIT 1").arg(userid);\n qDebug()<<queryStr<<userid;\n QSqlQuery query;\n qDebug ()<<query.exec(queryStr);\n if (query.exec(queryStr) && query.next())\n {\n qDebug() << "a"<<query.value(0);\n return query.value(0).toString();\n }\n else\n {\n qDebug() << "得到上一次状态错误: " << query.lastError().text();\n return "";\n }\n}\n\nvoid Lights::updateLastBrightness(int userid,QString brightness,QString state)\n{\n Sqlite::sqlite_init();\n QString queryStr = QString("UPDATE Status SET value = '%1' AND device_state = '%2' WHERE uid = %3 AND device_name = '智能灯'").arg(brightness).arg(state).arg(userid);\n QSqlQuery query;\n if (!query.exec(queryStr))\n {\n qDebug() << "更新亮度失败: " << query.lastError().text();\n }\n}\n\n\n\n\n// 问题出在SwitchForm的mousePressEvent函数中,需要将m_checked的值传递给SwitchForm的setChecked函数来更新状态。修改如下:\n\ncpp\nvoid SwitchForm::mousePressEvent(QMouseEvent *ev)\n{\n Q_UNUSED(ev)\n\n setChecked(!m_checked); // 更新状态\n emit statusChanged(m_checked);\n\n // 计算步长\n m_step = qAbs(m_endX - m_startX) / 10; // 修改步长的计算方式\n\n // 判断是否使用动画\n if (m_animation) {\n m_timer->start();\n } else {\n m_startX = m_endX;\n update();\n }\n}\n\n\n// 另外,Lights类中的switchButton_status函数应该是一个槽函数,需要使用Q_SLOT宏进行声明。修改如下:\n\ncpp\nclass Lights : public QWidget\n{\n Q_OBJECT\n\npublic:\n // ...\n\npublic slots:\n bool switchButton_status(bool checked);\n\n // ...\n};\n\n\n// 然后在cpp文件中连接信号和槽函数:\n\ncpp\nconnect(ui->SwitchStatus, SIGNAL(statusChanged(bool)), this, SLOT(switchButton_status(bool)));\n\n\n// 最后,在Lights类的构造函数中,将连接信号和槽函数的方式修改为新的语法:\n\ncpp\nconnect(ui->Finished, &QPushButton::clicked, this, [=]{\n if(flag)\n {\n QString brighteness = QString::number(ui->ctrlform->getValue());\n qDebug()<<brighteness<<userid;\n updateSmartHomeStatus(userid,QString("智能灯"),QString("开启"),brighteness);\n }else\n {\n qDebug() << \"智能灯未打开!\";\n updateSmartHomeStatus(userid,QString("智能灯"),QString("关闭"),QString("0"));\n }\n});\n\n\n// 这样,在SwitchStatus状态改变时,会自动调用switchButton_status函数来更新ctrlform的状态。\n\n// 问题出在SwitchForm的mousePressEvent函数中,需要将m_checked的值传递给SwitchForm的setChecked函数来更新状态。修改如下:\n\ncpp\nvoid SwitchForm::mousePressEvent(QMouseEvent *ev)\n{\n Q_UNUSED(ev)\n\n setChecked(!m_checked); // 更新状态\n emit statusChanged(m_checked);\n\n // 计算步长\n m_step = qAbs(m_endX - m_startX) / 10; // 修改步长的计算方式\n\n // 判断是否使用动画\n if (m_animation) {\n m_timer->start();\n } else {\n m_startX = m_endX;\n update();\n }\n}\n\n\n// 另外,Lights类中的switchButton_status函数应该是一个槽函数,需要使用Q_SLOT宏进行声明。修改如下:\n\ncpp\nclass Lights : public QWidget\n{\n Q_OBJECT\n\npublic:\n // ...\n\npublic slots:\n bool switchButton_status(bool checked);\n\n // ...\n};\n\n\n// 然后在cpp文件中连接信号和槽函数:\n\ncpp\nconnect(ui->SwitchStatus, SIGNAL(statusChanged(bool)), this, SLOT(switchButton_status(bool)));\n\n\n// 最后,在Lights类的构造函数中,将连接信号和槽函数的方式修改为新的语法:\n\ncpp\nconnect(ui->Finished, &QPushButton::clicked, this, [=]{\n if(flag)\n {\n QString brighteness = QString::number(ui->ctrlform->getValue());\n qDebug()<<brighteness<<userid;\n updateSmartHomeStatus(userid,QString("智能灯"),QString("开启"),brighteness);\n }else\n {\n qDebug() << \"智能灯未打开!\";\n updateSmartHomeStatus(userid,QString("智能灯"),QString("关闭"),QString("0"));\n }\n});\n\n\n// 这样,在SwitchStatus状态改变时,会自动调用switchButton_status函数来更新ctrlform的状态。\n


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

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