玉兔远程控制 0.1.0-bate8
载入中...
搜索中...
未找到
ParameterDatabaseUI.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QMessageBox>
4#include <QSqlDatabase>
5#include <QLoggingCategory>
6#include <QSet>
7#include <QFileDialog>
8#include <QWhatsThisClickedEvent>
9#include <QDesktopServices>
10
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"
17#include "Database.h"
18
19static Q_LOGGING_CATEGORY(log, "Para.Database.UI")
21 : CParameterUI(parent)
22 , ui(new Ui::CParameterDatabaseUI)
23 , m_pParaDB(nullptr)
24 , m_pParaGlobal(nullptr)
25 , m_Net(nullptr)
26{
27 bool check = false;
28 ui->setupUi(this);
29
30 setWindowTitle(tr("Database"));
31
32 ui->leDatabaseName->installEventFilter(this);
33 ui->pbBrowser->setVisible(false);
34
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);
45 Q_ASSERT(check);
46}
47
48CParameterDatabaseUI::~CParameterDatabaseUI()
49{
50 delete ui;
51}
52
54{
55 m_pParaGlobal = qobject_cast<CParameterGlobal*>(pParameter);
56 if(!m_pParaGlobal) return -1;
57
58 m_pParaDB = &m_pParaGlobal->m_Database;
59 if(!m_pParaDB) return -1;
60
61 m_Net = m_pParaDB->m_Net;
62 ui->wNet->SetParameter(&m_Net);
63
64 ui->cbType->setCurrentText(m_pParaDB->GetType());
65 ui->leDatabaseName->setText(m_pParaDB->GetDatabaseName());
66 ui->leOptions->setText(m_pParaDB->GetOptions());
67
68 switch(m_pParaGlobal->GetSaveSettingsType()) {
69 case CParameterGlobal::SaveSettingsType::Local:
70 ui->rbSaveSettingsToLocal->setChecked(true);
71 break;
72 case CParameterGlobal::SaveSettingsType::Database:
73 ui->rbSaveSettingsToDatabase->setChecked(true);
74 break;
75 }
76 ui->lbDatabaseWarn->setVisible(
77 ui->rbSaveSettingsToDatabase->isChecked()
78 && ui->cbType->currentText() != "QSQLITE");
79
80 return 0;
81}
82
84{
85 if(!validity) return true;
86
87 if(ui->cbType->currentText() == "QMYSQL") {
88 if(!ui->wNet->CheckValidity(validity)) {
89 return false;
90 }
91 }
92
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\".");
96 szErr += "\n\n";
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();
102 return false;
103 }
104 }
105
106 return true;
107}
108
110{
111 ui->wNet->Accept();
112 m_pParaDB->m_Net = m_Net;
113 m_pParaDB->SetType(ui->cbType->currentText());
114
115 m_pParaDB->SetDatabaseName(ui->leDatabaseName->text());
116 m_pParaDB->SetOptions(ui->leOptions->text());
117
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);
122 }
123
124 return 0;
125}
126
127void CParameterDatabaseUI::slotTypeCurrentTextChanged(const QString &text)
128{
129 QString szMsg;
130 QString szHelp;
131 szMsg = tr("Set the database name");
132
133 bool bBrowser = false;
134 bool bNet = true;
135 if("QSQLITE" == text) {
136 szMsg = tr("Set the sqlite database file. If is empty, then use default database file.");
137 bBrowser = true;
138 bNet = false;
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>";
142 bNet = false;
143 } else if("QMYSQL" == text) {
144 bNet = true;
145 if(m_pParaDB) {
146 auto &net = m_pParaDB->m_Net;
147 if(0 == net.GetPort()) {
148 net.SetPort(3306);
149 ui->wNet->SetParameter(&net);
150 }
151 }
152 }
153
154 if(szHelp.isEmpty())
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);
161
162 ui->lbDatabaseWarn->setVisible(
163 ui->rbSaveSettingsToDatabase->isChecked()
164 && ui->cbType->currentText() != "QSQLITE");
165}
166
167void CParameterDatabaseUI::on_pbBrowser_clicked()
168{
169 QString szTitle;
170 QString szFilter;
171 szTitle = tr("Database file");
172 szFilter = tr("Database file (*.db);; All files (*.*)");
173 QString szFile = QFileDialog::getSaveFileName(
174 nullptr, szTitle,
175 RabbitCommon::CDir::Instance()->GetDirUserDatabase(),
176 szFilter);
177 if(szFile.isEmpty()) return;
178 ui->leDatabaseName->setText(szFile);
179}
180
181bool CParameterDatabaseUI::eventFilter(QObject *watched, QEvent *event)
182{
183 if(ui->leDatabaseName == watched) {
184 if(event->type() == QEvent::WhatsThisClicked) {
185 QWhatsThisClickedEvent* e = (QWhatsThisClickedEvent*)event;
186 if(e) {
187 qDebug(log) << e->href();
188 return QDesktopServices::openUrl(e->href());
189 }
190 }
191 }
192 return QWidget::eventFilter(watched, event);
193}
194
195void CParameterDatabaseUI::on_rbSaveSettingsToDatabase_toggled(bool checked)
196{
197 ui->lbDatabaseWarn->setVisible(checked && ui->cbType->currentText() != "QSQLITE");
198}
199
200void CParameterDatabaseUI::on_pbTest_clicked()
201{
202 CParameterDatabase dbPara;
203 dbPara.SetType(ui->cbType->currentText());
204 dbPara.SetDatabaseName(ui->leDatabaseName->text());
205 dbPara.SetOptions(ui->leOptions->text());
206 if(!CheckValidity(true))
207 return;
208 ui->wNet->Accept();
209 dbPara.m_Net = m_Net;
210 CDatabase db;
211 bool bRet = db.OpenDatabase(&dbPara);
212 if(bRet) {
213 bRet = db.IsOpen();
214 }
215 if(bRet)
216 QMessageBox::information(this, tr("Test"), tr("Test is successfully!"));
217 else
218 QMessageBox::critical(this, tr("Test"),
219 tr("Test is failed!") + "\n\n"
220 + db.GetError());
221 db.CloseDatabase();
222}
223
提供打开数据库和初始化数据库等接口
Definition Database.h:21
void CloseDatabase()
Close database
Definition Database.cpp:321
bool OpenDatabase(const CParameterDatabase *pPara=nullptr, const QString &szConnectName=QString())
Open a new database
Definition Database.cpp:69
virtual int SetParameter(CParameter *pParameter) override
[override functions]
virtual bool CheckValidity(bool validity) override
检查参数的有效性
virtual int Accept() override
接受参数。如果需要,可先调用 CheckValidity
参数界面接口
Definition ParameterUI.h:15
参数接口
Definition Parameter.h:218