项目是开发上位机软件,需要在配置界面中,修改配置后,同步修改数据库,这里的数据库用的是sqlite3,系统是linux。
- QLineEdit
定义的QLineEdit类型,触发信号修改数据库方法如下:
connect(systemNameLineEdit, &QLineEdit::textChanged,this->systemNameLineEdit,[=](){
_pDataAccess->system_config_update("machine_name",systemNameLineEdit->text());
});//当界面上“系统名”栏改变时,更新数据库
2 QTabBar
定义的QTabBar类型,触发信号修改数据库方法如下:
connect(languageSettingTabBar, &QTabBar::currentChanged,this->languageSettingTabBar,[=](){
_pDataAccess->system_config_update("lang",QString::number(languageSettingTabBar->currentIndex()));
});//当界面上“语言设置”栏改变时,更新数据库
3 QCheckBox
定义的QCheckBox类型,触发信号修改数据库方法如下:
connect(dcsRadioButton, &QCheckBox::stateChanged,this->dcsRadioButton,[=](){
_pDataAccess->system_config_update("dcs_switch",QString::number(dcsRadioButton->checkState()));
});//当界面上“DCS”是否打开状态改变时,更新数据库
5 QSpinBox
定义的QCheckBox类型,触发信号修改数据库方法如下:信号需要这样写QOverload<int>::of(&QSpinBox::valueChanged)
connect(broadcastTimeComboBox, QOverload<int>::of(&QSpinBox::valueChanged),this->broadcastTimeComboBox,[=](){
_pDataAccess->system_config_update("broadcast_time",QString::number(broadcastTimeComboBox->value()));
});//当界面上“广播时间”是否打开状态改变时,更新数据库
注意:connect的第三个参数,要添加this->变量,如代码段所示,是因为变量在上引文中应用的如何,发射信号后,所定义的变量已经释放,会内存越界,所以这里报一个警告:
Pass a context object as connect 3th paramter
数据库代码如下:这里可以用同一个函数修改所有配置界面中的控件数据。
void SqlDataAccess::system_config_update(QString lineName, QString newValue)
{
QSqlQuery* _querySql=new QSqlQuery(sqlDatabase);
QString p=QString("UPDATE system_config set %1='%2'")
.arg(lineName,newValue);
_querySql->exec(p);//若该sql语句准备好了,可以被执行。则返回true
}