R
Rus6lanМаусым 5, 2017, түсқайта

TableView в QSqlRelationalTableModel

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

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

5
Evgenii Legotckoi
  • Маусым 6, 2017, 7: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
    • Маусым 7, 2017, 4: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
      • Маусым 8, 2017, 5:54 Т.Ж.

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

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

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

        void MainWindow::clickedRow(QModelIndex &index)
        На такую:
        void MainWindow::clickedRow(QModelIndex index)
          Evgenii Legotckoi
          • Маусым 10, 2017, 10:07 Т.Ж.

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

            Пікірлер

            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
            Кіріңіз немесе Тіркеліңіз
            Г

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

            • Нәтиже:66ұпай,
            • Бағалау ұпайлары-1
            t

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

            • Нәтиже:33ұпай,
            • Бағалау ұпайлары-10
            t

            Qt - Тест 001. Сигналы и слоты

            • Нәтиже:52ұпай,
            • Бағалау ұпайлары-4
            Соңғы пікірлер
            G
            GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
            Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
            d
            dblas5Шілде 5, 2024, 11:02 Т.Ж.
            QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            k
            kmssrАқп. 8, 2024, 6:43 Т.Қ.
            Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            АК
            Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
            Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            Енді форумда талқылаңыз
            Evgenii Legotckoi
            Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
            F
            FynjyШілде 22, 2024, 4:15 Т.Ж.
            при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
            BlinCT
            BlinCTМаусым 25, 2024, 1 Т.Ж.
            Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
            BlinCT
            BlinCTМамыр 5, 2024, 5:46 Т.Ж.
            Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
            Evgenii Legotckoi
            Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

            Бізді әлеуметтік желілерде бақылаңыз