Russian Qt Forum
Май 03, 2024, 23:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 [2]
16  Qt / Базы данных / Re: Работа с БД в отдельном потоке : Июнь 01, 2022, 16:02
Если кому то вдруг пригодится через СИГНАЛ-СЛОТ можно прокидвать указатели на любые типы данных Улыбающийся Прокидываю указатель на QSqlQuery
Тему можно считать закрытой
17  Qt / Базы данных / Re: Работа с БД в отдельном потоке : Май 31, 2022, 09:16
Ни в коем случае не ругаюсь на ваше предложение, огромное спасибо за подсказку, не думал о таком решении, так как мыслил в связи с выбранной архитектурой. Реализую как временное решение.

Может кто то еще подскажет решения как из потока получить данные из БД.
18  Qt / Базы данных / Re: Работа с БД в отдельном потоке : Май 31, 2022, 07:11
Дело в том что у меня ~20 вью в которые необходимо отдавать результаты запросов. Не хочется хранить ссылки на вью в модели. Согласно архитектуре Model View Presenter отображение и модель не должны быть связаны друг с другом никак. Потому хочется прокидывать результат. Ну либо ссылку на требуемую вью непосредственно при запросе.
19  Qt / Базы данных / Re: Работа с БД в отдельном потоке : Май 30, 2022, 21:47
Спасибо, завтра обязательно попробую,
Была такая мысль, но сомневался в корректности доступа к табличке из другого потока.

Единственное что смущает - не нашел что у QTableView реализован конструктор копирования, как я понимаю без него  не получится зарегистрироовать мета тип и, соответственно, установить коннекты между методами объектов.
20  Qt / Базы данных / Работа с БД в отдельном потоке : Май 30, 2022, 16:50
Решил вынести работу с базой данных в отдельный поток

Приложение строится на архитектуре 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>();

Заранее спасибо
Страниц: 1 [2]

Страница сгенерирована за 0.056 секунд. Запросов: 23.