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) #define SET_OBJECT_NAME(var) var->setObjectName(#var)
void ConnectionConfigurationWidget::editExistingInWindow(ConnectionController *connection_controller, const ConnectionConfig &cfg, void ConnectionConfigurationWidget::editExistingInWindow(ConnectionController *connection_controller, const ConnectionConfig &cfg,
std::function<void(ConnectionConfigurationWidget&)> save_func) std::function<void(ConnectionConfigurationWidget&)> save_func)
{ {
@ -43,9 +44,6 @@ void ConnectionConfigurationWidget::editExistingInWindow(ConnectionController *c
win->setAttribute( Qt::WA_DeleteOnClose, true ); win->setAttribute( Qt::WA_DeleteOnClose, true );
QObject::connect(btn_hbox, &QDialogButtonBox::accepted, [w, win, save_func] () { 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); save_func(*w);
win->accept(); 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) : QWidget(parent)
, m_connectionController(connection_controller) , m_connectionController(connection_controller)
, m_connectionModel(connection_controller->getConnectionTreeModel()) , m_connectionModel(connection_controller->getConnectionTreeModel())
@ -168,9 +168,6 @@ ConnectionConfigurationWidget::ConnectionConfigurationWidget(ConnectionControlle
formLayout->addRow(btnTest, lblResult); formLayout->addRow(btnTest, lblResult);
setLayout(formLayout); setLayout(formLayout);
connect(&TestWatcher, &QFutureWatcher<TestConnectionResult>::finished, this,
&ConnectionConfigurationWidget::handleTestResult);
retranslateUi(); retranslateUi();
} }
@ -255,15 +252,19 @@ void ConnectionConfigurationWidget::testConnection()
auto cc = data(); auto cc = data();
cc.setPassword(password); 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()); lblResult->setText(result.message());
QString current = cmbDbname->currentText(); QString current = cmbDbname->currentText();
cmbDbname->clear(); cmbDbname->clear();

View file

@ -3,7 +3,6 @@
#include <QWidget> #include <QWidget>
#include <QUuid> #include <QUuid>
#include <QFutureWatcher>
#include <tuple> #include <tuple>
#include "TestConnection.h" #include "TestConnection.h"
@ -20,7 +19,6 @@ class QSpinBox;
class ConnectionTreeModel; class ConnectionTreeModel;
class ConnectionConfigurationWidget : public QWidget class ConnectionConfigurationWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
@ -28,14 +26,15 @@ public:
static void editExistingInWindow(ConnectionController *ctrl, const ConnectionConfig &cfg, static void editExistingInWindow(ConnectionController *ctrl, const ConnectionConfig &cfg,
std::function<void(ConnectionConfigurationWidget&)> save_func); std::function<void(ConnectionConfigurationWidget&)> save_func);
explicit ConnectionConfigurationWidget(ConnectionController *connection_controller, QWidget *parent = nullptr); explicit ConnectionConfigurationWidget(
ConnectionController *connection_controller,
QWidget *parent = nullptr);
void retranslateUi(); void retranslateUi();
void setData(const ConnectionConfig &cfg); void setData(const ConnectionConfig &cfg);
ConnectionConfig data() const; ConnectionConfig data() const;
QString group() const; QString group() const;
bool savePassword() const; bool savePassword() const;
signals:
public slots: public slots:
void testConnection(); void testConnection();
@ -77,13 +76,7 @@ private:
QLabel *lblResult; QLabel *lblResult;
QFormLayout *formLayout; QFormLayout *formLayout;
void handleTestResult(TestConnectionResult result);
QFutureWatcher<TestConnectionResult> TestWatcher;
private slots:
void handleTestResult();
}; };
#endif // CONNECTIONCONFIGURATIONWIDGET_H #endif // CONNECTIONCONFIGURATIONWIDGET_H