Юрий
Юрий11 апреля 2017 г. 12:02

Обновление модели по таймеру при изменении в БД

Qt

Как реализовать механизм обновления данных в QTableView при изменении в БД MySQL

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

5
Evgenii Legotckoi
  • 11 апреля 2017 г. 12:40
  • Ответ был помечен как решение.

Ну, если вопрос по реализации обновления от таймера, то по сигналу просто делайте select в модели данных. Если конечно используется какая-нибудь модель данных типа QSqlTableModel , QSqlRealtionalTableModel или модель наследованная от этих моделей.

В заголовочном файле добавьте объект QTimer, можно причём сохранить в стеке, а не в куче через оператор new .

QTimer m_timer;

А если учесть, что метод select() у модели данных QSqlTableModel является публичным слотом, то можно напрямую сигнал от таймера подключить к этому методу. Тогда с определённой периодичностью будут обновляться данные, если они изменялись.

Вот например обновление раз в минуту:

m_timer;
connect(&m_timer, &QTimer::timeout, model, &QSqlTableModel::select);
m_timer.start(60 * 1000);

Модель данных должна быть установлена в QTableView . Чтобы узнать об изменениях в базе данных, нужно будет сделать выборку ( select() ). Сама БД никак не сообщит об этом.

    Юрий
    • 11 апреля 2017 г. 13:28

    Так я и сделал, но мне надо при изменении данных в таблице БД .

      Evgenii Legotckoi
      • 11 апреля 2017 г. 13:39

      Когда происходит изменение данных в таблице БД? При каких действиях. Они же не на пустом месте происходят? При изменении данных сторонними средствами? Сторонней программой? Или вашей же программой? Поподробнее никак нельзя объяснить проблему? Серебряной пули не бывает.

        Юрий
        • 11 апреля 2017 г. 13:48

        А если проверять значения с помощью

        SELECT   `UPDATE_TIME`
         FROM  INFORMATION_SCHEMA.PARTITIONS
         WHERE   TABLE_NAME   = 'table'
        и сравнивать с ранее сохраненным значением?
          Evgenii Legotckoi
          • 11 апреля 2017 г. 14:05

          Да. Это может сработать. Во всяком случае нагрузка может уменьшиться. Вместо того, чтобы тащить всю таблицу через select будете делать более экономичный запрос, но опять же по таймеру. Вообще у QSqlDriver есть возможность подписки на уведомления от базы данных. Метод subscribeToNotification , но вот тут уже проблема имеется в том, что MySQL не имеет механизма notify , то есть подписаться на уведомления от базы данных просто так не получится, вообще информации по MySQL на эту тему практически нет. А вот с PostgreSQL здесь в разы лучше ситуация. У него имеются уведомления, на которые можно подписаться, самые простые NOTIFY, LISTEN, UNLISTEN . Можно вроде как и на отдельные таблицы подписываться. Так что в случае с PostgreSQL это проще реализовать. Сама база данных будет этому способствовать. В случае же с MySQL - это таймеры и прочие костыли. Так что, если есть возможность сменить БД , то подумайте над этим.

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            d
            • dsfs
            • 26 апреля 2024 г. 11:56

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:80баллов,
            • Очки рейтинга4
            d
            • dsfs
            • 26 апреля 2024 г. 11:45

            C++ - Тест 002. Константы

            • Результат:50баллов,
            • Очки рейтинга-4
            d
            • dsfs
            • 26 апреля 2024 г. 11:35

            C++ - Тест 001. Первая программа и типы данных

            • Результат:73баллов,
            • Очки рейтинга1
            Последние комментарии
            k
            kmssr9 февраля 2024 г. 2:43
            Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            АК
            Анатолий Кононенко5 февраля 2024 г. 9:50
            Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            EVA
            EVA25 декабря 2023 г. 18:30
            Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
            J
            JonnyJo25 декабря 2023 г. 16:38
            Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
            G
            Gvozdik19 декабря 2023 г. 5:01
            Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
            Сейчас обсуждают на форуме
            Evgenii Legotckoi
            Evgenii Legotckoi2 мая 2024 г. 21:07
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
            IscanderChe
            IscanderChe30 апреля 2024 г. 11:22
            Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
            G
            Gar22 апреля 2024 г. 12:46
            Clipboard Как скопировать окно целиком в clipb?
            Павел Дорофеев
            Павел Дорофеев14 апреля 2024 г. 9:35
            QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
            f
            fastrex4 апреля 2024 г. 11:47
            Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

            Следите за нами в социальных сетях