Решил вынести работу с базой данных в отдельный поток
Приложение строится на архитектуре Model-View-Presenter
В модели БД воркер (SqlWorker ниже), агрегирующий класс-исполнитель запросов (SqlQueryExecutor)
class SqlWorker : public QObject
{
Q_OBJECT
public:
explicit SqlWorker(QObject *parent = nullptr);
~SqlWorker ();
void addDbServer (QString serverName, QHostAddress address);
QList <QString> getDbServers ();
QString getLastUsedDbName () { return currentDbName; }
bool openDbConnection(QString serverName, QString login, QString password);
private:
QString currentDbName;
QHash<QString, QHostAddress> dbServers;
QThread * executorThread;
SqlQueryExecutor * executor;
signals:
void stopExecutor ();
void executorOpenDbConnection (QString, QString, QString, QString);
void dbErrorOccured (STATE, QString, QString, bool);
private slots:
void slotHandleDbError (qint8 error, QString errorDescription, QString dbName);
void slotDbConnected (QString);
};
class SqlQueryExecutor : public QObject
{
Q_OBJECT
public:
explicit SqlQueryExecutor(QObject *parent = nullptr);
~SqlQueryExecutor ();
private:
const QString strQueryA618;
QString strWhereA618;
A618SqlModel * model618;
void changeModel618 (const QString& query);
signals:
void dbConnected (QString);
void dbDbErrorAppears (qint8 error, QString errorDescription, QString dbName);
void return618Data (A618SqlModel & model);
void finished ();
public slots:
void slotStartExecutorThread ();
void slotStopExecutorThread ();
void slotOpenDbConnection (QString adress, QString serverName, QString login, QString password);
void slotGet618Messages (unsigned int turplesLimit);
};
class A618SqlModel : public QSqlQueryModel
{
Q_OBJECT
public:
A618SqlModel(QObject *parent = 0);
QVariant data(const QModelIndex &index, int role) const;
};
Q_DECLARE_METATYPE(A618SqlModel)
Проблема в том что ранее в однопоточном исполнении результат выполнения запроса попадал в модель A618SqlModel, котрая успешно скармливалась QtableView
Однако сейчас я не могу передать результат выполения запроса, так как не могу использовать A618SqlModel для передачи в виде параметра сигнала (не могу зарегистрировать его как метатип, потому что конструктор копирования закрыт).
Подскажите пожалуйста как правильно в Qt правильно передать результат выполния запроса к БД из другого потока.
QObject::connect(modelObject, SIGNAL(return618Data(A618SqlModel &)), this, SLOT(slotSet618Messages(A618SqlModel &)));
qRegisterMetaType<A618SqlModel>();
Заранее спасибо