Use then construct instead of future watcher for test connection.ConnectionConfigurationWidget

The QPointer is detect the window has been destroyed.
This commit is contained in:
eelke 2022-01-16 17:59:28 +01:00
parent 90851ef950
commit 521e5d7370
2 changed files with 18 additions and 24 deletions

View file

@ -24,6 +24,7 @@
#define SET_OBJECT_NAME(var) var->setObjectName(#var)
void ConnectionConfigurationWidget::editExistingInWindow(ConnectionController *connection_controller, const ConnectionConfig &cfg,
std::function<void(ConnectionConfigurationWidget&)> save_func)
{
@ -43,9 +44,6 @@ void ConnectionConfigurationWidget::editExistingInWindow(ConnectionController *c
win->setAttribute( Qt::WA_DeleteOnClose, true );
QObject::connect(btn_hbox, &QDialogButtonBox::accepted, [w, win, save_func] () {
// auto cc = w->data();
// auto grp = w->group();
// connection_controller->getConnectionTreeModel()->save(grp, cc);
save_func(*w);
win->accept();
});
@ -61,7 +59,9 @@ void ConnectionConfigurationWidget::editExistingInWindow(ConnectionController *c
}
}
ConnectionConfigurationWidget::ConnectionConfigurationWidget(ConnectionController *connection_controller, QWidget *parent)
ConnectionConfigurationWidget::ConnectionConfigurationWidget(
ConnectionController *connection_controller,
QWidget *parent)
: QWidget(parent)
, m_connectionController(connection_controller)
, m_connectionModel(connection_controller->getConnectionTreeModel())
@ -168,9 +168,6 @@ ConnectionConfigurationWidget::ConnectionConfigurationWidget(ConnectionControlle
formLayout->addRow(btnTest, lblResult);
setLayout(formLayout);
connect(&TestWatcher, &QFutureWatcher<TestConnectionResult>::finished, this,
&ConnectionConfigurationWidget::handleTestResult);
retranslateUi();
}
@ -255,15 +252,19 @@ void ConnectionConfigurationWidget::testConnection()
auto cc = data();
cc.setPassword(password);
QFuture<TestConnectionResult> result = QtConcurrent::run([cc] { return TestConnection(cc); });
TestWatcher.setFuture(result);
auto qthis = QPointer(this);
QFuture<void> result = QtConcurrent::run([cc] {
return TestConnection(cc);
}).then(qApp, [qthis](TestConnectionResult result) {
if (qthis) {
qthis.data()->handleTestResult(result);
}
});
}
void ConnectionConfigurationWidget::handleTestResult()
void ConnectionConfigurationWidget::handleTestResult(TestConnectionResult result)
{
auto f = TestWatcher.future();
auto result = f.result();
lblResult->setText(result.message());
QString current = cmbDbname->currentText();
cmbDbname->clear();