5#include <QLoggingCategory>
8#include <QWhatsThisClickedEvent>
9#include <QDesktopServices>
11#include "RabbitCommonDir.h"
12#include "ParameterNet.h"
13#include "ParameterUser.h"
14#include "ParameterDatabaseUI.h"
15#include "ui_ParameterDatabaseUI.h"
16#include "ParameterGlobal.h"
19static Q_LOGGING_CATEGORY(log,
"Para.Database.UI")
24 , m_pParaGlobal(
nullptr)
30 setWindowTitle(tr(
"Database"));
32 ui->leDatabaseName->installEventFilter(
this);
33 ui->pbBrowser->setVisible(
false);
35 QStringList drivers = QSqlDatabase::drivers();
36 qDebug(log) <<
"Database:" << drivers;
37 QSet<QString> supportDrivers = CParameterDatabase::GetSupportDatabase();
38 QSet<QString> drv(drivers.begin(), drivers.end());
39 QSet<QString> interDb = drv.intersect(supportDrivers);
40 QStringList lstDb(interDb.begin(), interDb.end());
41 ui->cbType->addItems(lstDb);
42 slotTypeCurrentTextChanged(ui->cbType->currentText());
43 check = connect(ui->cbType, &QComboBox::currentTextChanged,
44 this, &CParameterDatabaseUI::slotTypeCurrentTextChanged);
48CParameterDatabaseUI::~CParameterDatabaseUI()
55 m_pParaGlobal = qobject_cast<CParameterGlobal*>(pParameter);
56 if(!m_pParaGlobal)
return -1;
58 m_pParaDB = &m_pParaGlobal->m_Database;
59 if(!m_pParaDB)
return -1;
61 m_Net = m_pParaDB->m_Net;
62 ui->wNet->SetParameter(&m_Net);
64 ui->cbType->setCurrentText(m_pParaDB->GetType());
65 ui->leDatabaseName->setText(m_pParaDB->GetDatabaseName());
66 ui->leOptions->setText(m_pParaDB->GetOptions());
68 switch(m_pParaGlobal->GetSaveSettingsType()) {
69 case CParameterGlobal::SaveSettingsType::Local:
70 ui->rbSaveSettingsToLocal->setChecked(
true);
72 case CParameterGlobal::SaveSettingsType::Database:
73 ui->rbSaveSettingsToDatabase->setChecked(
true);
76 ui->lbDatabaseWarn->setVisible(
77 ui->rbSaveSettingsToDatabase->isChecked()
78 && ui->cbType->currentText() !=
"QSQLITE");
85 if(!validity)
return true;
87 if(ui->cbType->currentText() ==
"QMYSQL") {
88 if(!ui->wNet->CheckValidity(validity)) {
93 if(ui->rbSaveSettingsToLocal->isChecked()) {
94 if(ui->cbType->currentText() !=
"QSQLITE") {
95 QString szErr = tr(
"Save operate settings to:") +
" \"" + tr(
"Local") +
"\". " + tr(
"but the database is not set local database \"QSQLITE\".");
97 szErr += tr(
"Please modify database \"Type\" to \"QSQLITE\"") +
" ";
98 szErr += tr(
"or modify ") + tr(
"Save operate settings to:") +
" " + tr(
"Database");
99 QMessageBox::critical(
this, tr(
"Error"), szErr);
100 qCritical(log) << szErr;
101 ui->rbSaveSettingsToDatabase->setFocus();
112 m_pParaDB->m_Net = m_Net;
113 m_pParaDB->SetType(ui->cbType->currentText());
115 m_pParaDB->SetDatabaseName(ui->leDatabaseName->text());
116 m_pParaDB->SetOptions(ui->leOptions->text());
118 if(ui->rbSaveSettingsToLocal->isChecked()) {
119 m_pParaGlobal->SetSaveSettingsType(CParameterGlobal::SaveSettingsType::Local);
120 }
else if(ui->rbSaveSettingsToDatabase->isChecked()) {
121 m_pParaGlobal->SetSaveSettingsType(CParameterGlobal::SaveSettingsType::Database);
127void CParameterDatabaseUI::slotTypeCurrentTextChanged(
const QString &text)
131 szMsg = tr(
"Set the database name");
133 bool bBrowser =
false;
135 if(
"QSQLITE" == text) {
136 szMsg = tr(
"Set the sqlite database file. If is empty, then use default database file.");
139 }
else if(
"QODBC" == text) {
140 szMsg = tr(
"The name can either be a DSN, a DSN filename (in which case the file must have a .dsn extension), or a connection string.");
141 szHelp = szMsg +
" <a href=https://github.com/KangLin/RabbitRemoteControl/wiki/UserManual_zh_CN#%E5%9C%A8-windows-%E4%B8%8B%E4%BD%BF%E7%94%A8-odbc-%E8%AE%BF%E9%97%AE-mysql-%E6%95%B0%E6%8D%AE%E5%BA%93>" + tr(
"Configure database") +
"</a>";
143 }
else if(
"QMYSQL" == text) {
146 auto &net = m_pParaDB->m_Net;
147 if(0 == net.GetPort()) {
149 ui->wNet->SetParameter(&net);
155 szHelp = szMsg +
" <a href=https://github.com/KangLin/RabbitRemoteControl/wiki/UserManual_zh_CN#%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93>" + tr(
"Configure database") +
"</a>";
156 ui->leDatabaseName->setWhatsThis(szHelp);
157 ui->leDatabaseName->setPlaceholderText(szMsg);
158 ui->leDatabaseName->setToolTip(szMsg);
159 ui->pbBrowser->setVisible(bBrowser);
160 ui->wNet->setVisible(bNet);
162 ui->lbDatabaseWarn->setVisible(
163 ui->rbSaveSettingsToDatabase->isChecked()
164 && ui->cbType->currentText() !=
"QSQLITE");
167void CParameterDatabaseUI::on_pbBrowser_clicked()
171 szTitle = tr(
"Database file");
172 szFilter = tr(
"Database file (*.db);; All files (*.*)");
173 QString szFile = QFileDialog::getSaveFileName(
175 RabbitCommon::CDir::Instance()->GetDirUserDatabase(),
177 if(szFile.isEmpty())
return;
178 ui->leDatabaseName->setText(szFile);
181bool CParameterDatabaseUI::eventFilter(QObject *watched, QEvent *event)
183 if(ui->leDatabaseName == watched) {
184 if(event->type() == QEvent::WhatsThisClicked) {
185 QWhatsThisClickedEvent* e = (QWhatsThisClickedEvent*)event;
187 qDebug(log) << e->href();
188 return QDesktopServices::openUrl(e->href());
192 return QWidget::eventFilter(watched, event);
195void CParameterDatabaseUI::on_rbSaveSettingsToDatabase_toggled(
bool checked)
197 ui->lbDatabaseWarn->setVisible(checked && ui->cbType->currentText() !=
"QSQLITE");
200void CParameterDatabaseUI::on_pbTest_clicked()
203 dbPara.SetType(ui->cbType->currentText());
204 dbPara.SetDatabaseName(ui->leDatabaseName->text());
205 dbPara.SetOptions(ui->leOptions->text());
209 dbPara.m_Net = m_Net;
216 QMessageBox::information(
this, tr(
"Test"), tr(
"Test is successfully!"));
218 QMessageBox::critical(
this, tr(
"Test"),
219 tr(
"Test is failed!") +
"\n\n"
void CloseDatabase()
Close database
bool OpenDatabase(const CParameterDatabase *pPara=nullptr, const QString &szConnectName=QString())
Open a new database
virtual int SetParameter(CParameter *pParameter) override
[override functions]
virtual bool CheckValidity(bool validity) override
检查参数的有效性
virtual int Accept() override
接受参数。如果需要,可先调用 CheckValidity