R
Rus6lan05 червня 2017 р. 12:00

TableView в QSqlRelationalTableModel

Есть таблица студенты, есть таблицы преподаватели. Как сделать так, чтобы при выборе преподавателя в соседнем tableview автоматически показывалась модель этого преподавателя?

Screenshot_1.png
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

5
Evgenii Legotckoi
  • 06 червня 2017 р. 07:08
Не обязательно использовать QSqlRelationalModel. В принципе можно использовать и QSqlTableModel для этого. Суть в том, что нужно отслеживать клик по строкам в таблице преподавателей, забирать ID преподавателя и фильтровать записи в таблице со студентами преподавателя.
Как делается фильтр можете посмотреть в этой статье .
А так, делаете connect к QTableView , в котором у Вас находится список преподавателей:
 connect(ui->tableView, &QTableView::clicked, this, &MainWindow::clickedRow);
Сам слот с фильтром может выглядеть так:
void MainWindow::clickedRow(QModelIndex &index)
{
    modelStudents->setFilter(QString(ID_TEACHER = '%1').arg(model->data(model->index(index.row(), 0)).toInt());
    modelStudents->select();
}
    R
    • 07 червня 2017 р. 16:59

    Я идею понял, но сигналами беда.

    Во-первых я использую
    connect(dialog, EditDialog::insertToSqlModel,  this, MainWindow::insertToSqlModel);
    И вроде тоже работает(но я на всякий все сделал с амперсандом). Я не особо понимаю механизма передачи параметров в СЛОТ(Где почитать).
    Если я делаю слот таким
    void MainWindow::clickedRow(QModelIndex &index)
    {
        //QString filterQuery = QString("teacher_id = '%1'").arg(sqlModelTeachers->data(sqlModelTeachers->index(index.row(), 0)).toInt());
        sqlModelStudents->setFilter(QString("teacher_id = '%1'").arg(sqlModelTeachers->data(sqlModelTeachers->index(index.row(), 0)).toInt()));
        sqlModelStudents->select();
        ui->tableView_3->setModel(sqlModelStudents); 
    }
    То:
    D:\Qt\Qt5.8.0\5.8\mingw53_32\include\QtCore\qglobal.h:732: error: static assertion failed: Signal and slot arguments are not compatible.
     #define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)
    
    Если без параметров.
    
    void MainWindow::clickedRow()
    {    
    //QString filterQuery = QString("teacher_id = '%1'").arg(sqlModelTeachers->data(sqlModelTeachers->index(index.row(), 0)).toInt());    
    sqlModelStudents->setFilter(QString("teacher_id = '%1'").arg(sqlModelTeachers->data(sqlModelTeachers->index(4, 0)).toInt()));    
    sqlModelStudents->select();    
    ui->tableView_3->setModel(sqlModelStudents);
    }
    ТО все работает за исключением того, что фильтр не по выбранной колонке(потому что индекса нету), а просто по номеру в коде. ^
      Evgenii Legotckoi
      • 08 червня 2017 р. 05:54

      Почитайте вот эту статью по сигналам и слотам .

      Что касается ошибки, то дело в том, что сигнатура сигнала должна совпадать с сигнатурой слота.
      Расхождения в сигналах и слотах по сигнатуре может быть только в одном случае. Когда сигнал передаёт больше аргументов, чем принимает слот, но никак не наоборот.
      То есть, если сигнал такой:
      void someSignal(bool something);
      То слот должен быть таким же:
      void someSlot(bool something);
      Или в крайнем случае не иметь аргументов вовсе.
        R
        • 10 червня 2017 р. 06:24

        Вроде все заработало, когда я убрал поменял сигнатуры слота с такой:

        void MainWindow::clickedRow(QModelIndex &index)
        На такую:
        void MainWindow::clickedRow(QModelIndex index)
          Evgenii Legotckoi
          • 10 червня 2017 р. 10:07

          Это довольно странно. Это не сильно должно было повлиять на работоспособность.

            Коментарі

            Only authorized users can post comments.
            Please, Log in or Sign up
            Дмитрий

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

            • Результат:60бали,
            • Рейтинг балів-1
            Дмитрий

            C++ - Тест 003. Условия и циклы

            • Результат:92бали,
            • Рейтинг балів8
            d
            • dsfs
            • 26 квітня 2024 р. 11:56

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

            • Результат:80бали,
            • Рейтинг балів4
            Останні коментарі
            k
            kmssr09 лютого 2024 р. 02:43
            Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            АК
            Анатолий Кононенко05 лютого 2024 р. 09:50
            Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            EVA
            EVA25 грудня 2023 р. 18:30
            Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
            J
            JonnyJo25 грудня 2023 р. 16:38
            Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
            G
            Gvozdik19 грудня 2023 р. 05:01
            Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
            Тепер обговоріть на форумі
            G
            George1307 травня 2024 р. 07:27
            добавить qlineseries в функции в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент
            BlinCT
            BlinCT05 травня 2024 р. 12:46
            Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
            PS
            Peter Son04 травня 2024 р. 00:57
            Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
            Evgenii Legotckoi
            Evgenii Legotckoi02 травня 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_…

            Слідкуйте за нами в соціальних мережах