M
MadBear541March 21, 2017, 12:33 a.m.

передать результат запроса sql в другую форму

Подскажите как передать переменную QString в которой хранится результат Sql запроса в другую форму. И как в QComboBox передавать значение из таблицы одной формы, в ней данные заполняются по QSqlQueryModel чтоб сохранялось выбранное значение, так же надо чтоб вообще можно было выбирать любые поля ( это я реализовал).

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

11
Evgenii Legotckoi
  • March 21, 2017, 2:15 a.m.

Если есть некая абстрактная переменная QString , допустим m_string . То для передачи в другую форму, допустим это будет поле QLineEdit, поскольку слишком абстрактно вы сформулировали это понятие. Нужно сделать так:

someLineEdit->setText(m_string);

Ну а у QComboBox нужно использовать метод addItem()

QVariant m_someData; // Это опционально, может и не быть данных
someComboBox->addItem(m_string, m_someData);

А под сохранением выбранного значения, вообще не ясно, что вы подразумевали конкретно.

Слишком абстрактный вопрос, без конкретизации деталей ...

    M
    • March 21, 2017, 2:25 a.m.

    есть QString idrn - в не ложу стринговое значение результата sql запроса, то есть например idrn принимает значение Первомайский - имя района. мне теперь необходимо чтоб в другой форме по двойному клику в первой получал в QComboBox - который делает выборку из базы и предлагает имена районов. саму выборку я реализовал:

    void redit::setmod()
    {
    
        raymod = new QSqlRelationalTableModel(this);
        raymod->setEditStrategy(QSqlRelationalTableModel::OnManualSubmit);
        raymod->setTable("op_has_raion");
        int idray = raymod->fieldIndex("raion_id_rayn");
        raymod->setRelation(idray, QSqlRelation("raion", "id_rayn", "name_rayn"));
        if (!raymod->select())
        {
            qDebug()<<"No";
         }
        ui->rayn->setModel(raymod->relationModel(idray));
        ui->rayn->setModelColumn(raymod->relationModel(idray)->fieldIndex("name_rayn"));
        rmap = new QDataWidgetMapper();
        rmap->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
        rmap->setOrientation(Qt::Horizontal);
        rmap->setModel(raymod);
        rmap->addMapping(ui->rayn, raymod->fieldIndex("name_rayn"));
        rmap->toFirst();
    }
    где rayn - имя QComboBox. Так же мне надо для формирования sql запроса в форме два использовать значение idrn и еще пару аналогичных. я пытался сделать с использованием сигнала, но не вышло. Сам я в программировании подобного уровня новичок, по сути вообще ноль.
      Evgenii Legotckoi
      • March 21, 2017, 10:17 a.m.

      Если эта форма является таблицей, то бишь QTableView , то используйте сигнал doubleClicked , который вернёт QModelIndex, который будет указывать на текущую ячейку. А далее уже забираете данные из ячейки и кидаете их в QComboBox. Посмотрите статью по QDataWidgetMapper , там как раз используется сигнал doubleClicked .

      Если же подразумевается поле ввода, наподобие QLineEdit, то нужно наследоваться от этого класса и переопределять метод mouseDoubleClickEvent() . Вот в этом топике есть пример перегрузки. Сделаете в наследованном классе сигнал, который передаст значение, поймайте этот сигнал и установите его в QComboBox.

        M
        • March 21, 2017, 9:21 p.m.

        по статье QDataWidgetMapper и делал. Не передает он значение. И вопрос с передачей переменных все равно остается открытым.

          Evgenii Legotckoi
          • March 21, 2017, 10:21 p.m.

          Ну так показывайте код, как делали формы, как пытались передать значение. Или я должен догадываться, что вы там понаписали, по одной только фразе "Не передает он значение" ? - Телепаты в отпуске.

            M
            • March 21, 2017, 10:39 p.m.

            выше я уже приводил код в котором формируется модель для данных в QComboBox. При открытии формы в QComboBox выводится запись с индексом 1, т.е. самая первая, а не выбранная в предыдущем окне. Вот код из первой формы, для формирования данных и их передачи:

            /*по нажатию на строку в таблице "Распоряжения" получаем значение
            скрытого поля индекс "id_r" и передаем его в таблицу "rView",
            в которой отображаем список районов
            так же определяем номер распоряжения и его дату
            для дальнейшего использования
            */
            void arhon::on_opView_clicked(const QModelIndex)
            {
                int row = ui->opView->selectionModel()->currentIndex().row();
                if (row >= 0)
                {
                    QModelIndex cr = ui->opView->currentIndex();
                    indr = ui->opView->model()->data(ui->opView->model()->index(cr.row(),0),0).toString();
            
                    /*задаем дату и номер из таблицы op как переменные
                     для дальнейшего использования*/
                    QSqlQuery rn, dr;
                    //определяем номер распоряжения и записываем в переменную
                    rn.exec("SELECT r_number FROM op WHERE id_r = " + indr + ";");
                    rn.first();
                    rnum = rn.value(0).toString();
                    //определяем дату распоряжения и записываем в переменную
                    dr.exec("SELECT r_data FROM op WHERE id_r = " + indr + ";");
                    //rdat = dr.value("SELECT r_data FROM op WHERE id_r = " + indr + ";").toString();
                    dr.first();
                    rdat = dr.value(0).toString();
                    
                    //вывод списка районов для распоряжения и передаем в таблицу rView
                    rmodel = new QSqlQueryModel(this);
                    rmodel->setQuery("SELECT name_rayn FROM op "
                                 "JOIN op_has_raion ON op.id_r = op_has_raion.op_id_r "
                                 "JOIN raion ON raion.id_rayn = op_has_raion.raion_id_rayn "
                                 "WHERE id_r = " + indr + ";");
                    rmodel->setHeaderData(0, Qt::Horizontal, trUtf8("Район"));
                    ui->rView->setModel(rmodel); 
                }
            }
            
            //вызываем окно со списком объектов района
            void arhon::on_rView_doubleClicked(const QModelIndex &index)
            {
                reg = new redit(index.row());
                reg->setWindowTitle("Распоряжение № " +rnum+ " от " +rdat);
                reg->show();
                this->close();
            }
            
              Evgenii Legotckoi
              • March 23, 2017, 12:08 a.m.

              Вот в этом коде вы выставляете mapper на самую первую позицию:

              void redit::setmod()
              {
                  // *****
                  rmap->toFirst();
              }

              Mapper дёргает сразу всю таблицу, попробуйте выставлять нужную текущую строку через метод setCurrentIndex() или setCurrentModelIndex(). И ещё один такой момент для общего развития: QSqlQueryModel работает только на чтение, на запись она не работает. Просто помните про этот момент, когда будете с ней работать. Поэтому попытайтесь использовать QSqlRelationalTableModel, вместо QSqlQueryModel.

              Дату и номер распоряжений можно выдернуть сразу из модели, задав соответствующую колонку в методе data() без каких-либо дополнительных запросов к базе данных через QSqlQuery.

              Не уверен, когда ваш проблема пофиксится, но прежде чем до неё добраться, придётся поправить очень многие моменты, пока плаваете в методах моделей и дёргаете данные сырыми SQL запросами будет очень трудно фиксить те баги, которые создаёте.

              Постарайтесь сейчас поправить те моменты, на которые я указал во всём коде.

              Также сам проект ужасно организован. Директории obj и redit нужно как минимум перенести внутрь arhon. Либо сделать отдельным подключаемыми pri проектами.

                M
                • March 23, 2017, 12:25 a.m.

                Касательно QSqlRelationalTableModel и QSqlQueryModel - я в курсе, я их оба использую, что бы не позволять пользователю редактировать таблицы . Что же касается методов с использованием CurrentIndex тут я плаваю жутко. Как понять сырые SQL запросы? Что же касается даты и номера, спасибо что указали на ошибку. Тем более что метод data() я уже использовал. Касательно организации проекта, я сделал так для удобства работы с директорией проекта. в конце я это подправлю. У меня все также остается большой вопрос как организовать передачу номера и даты распоряжения в другую форму. Не хочу делать в каждой форме выборки из базы, а передовать их сквозь все необходимые формы. Вообще по проекту скажу - я в написании программ новичок и багов много. К сожалению у меня нет наставников и поэтому учусь по методу " Обезьяна с гранатой"

                  Evgenii Legotckoi
                  • March 23, 2017, 12:37 a.m.
                  • The answer was marked as a solution.

                  Под сырым SQL запросом я подразумеваю вот это:

                  QSqlQuery rn, dr;
                          //определяем номер распоряжения и записываем в переменную
                          rn.exec("SELECT r_number FROM op WHERE id_r = " + indr + ";"); // - это сырой SQL запрос
                          rn.first();

                  Вы в обоих случаях дёргаете данные из таблицы "op", причём и id получаете из этой же таблицы. Если я правильно понял код, то можно сделать проще и менее чувствительно к ошибкам (ошибки в записи SQL запросов иногда не так просто заметить, к сожалению):

                  indr = ui->opView->model()->data(ui->opView->model()->index(cr.row(), 0),0).toString();
                  rnum = ui->opView->model()->data(ui->opView->model()->index(cr.row(), 1),0).toString();
                  rdat = ui->opView->model()->data(ui->opView->model()->index(cr.row(), 2),0).toString();

                  Чтобы передать эти значения в другую форму (теперь хоть стало понятно, что это отдельные диалоговые окна), можно сделать сигнал или принимающий метод, в котором будут нужные методы. В вашем случае есть диалог redit . Ну и добавьте в него метод setParamters(indr, rnum, rdat)

                  Тогда можно будет сделать что-то типо такого:

                  void arhon::on_rView_doubleClicked(const QModelIndex &index)
                  {
                      reg = new redit(index.row());
                      indr = ui->opView->model()->data(ui->rView->model()->index(index.row(),0),0).toString();
                      rnum = ui->opView->model()->data(ui->rView->model()->index(index.row(),1),0).toString();
                      rdat = ui->opView->model()->data(ui->rView->model()->index(index.row(),2),0).toString();
                      reg->setParameters(indr, rnum, rdat);
                      reg->setWindowTitle("Распоряжение № " +rnum+ " от " +rdat);
                      reg->show();
                      this->close();
                  }

                  Идея примерно такая, поразбирайте её. 

                  Структуру проекта лучше сразу поправить.

                    M
                    • March 23, 2017, 12:42 a.m.

                    Значит я правильно понял про запросы. Спасибо что подсказали с передачей данных в другое окно я пробовал делать через emit sendData но к сожалению понял что не подходит этот метод. Буду причесывать запросы и разбираться с CurrentIndex() . Спасибо за консультацию

                      Evgenii Legotckoi
                      • March 23, 2017, 12:43 a.m.

                      Но это не готовый рабочий код - это идея. Я подробно не разбирался в том, что вы написали и не вникал в смысл таблиц, тем более, что без базы данных такие баги фиксить дело неблагодарное. Поэтому поразмышляйте над этим кодом что я привёл в качестве возможного варианта.

                        Comments

                        Only authorized users can post comments.
                        Please, Log in or Sign up
                        г
                        • ги
                        • April 23, 2024, 3:51 p.m.

                        C++ - Test 005. Structures and Classes

                        • Result:41points,
                        • Rating points-8
                        l
                        • laei
                        • April 23, 2024, 9:19 a.m.

                        C ++ - Test 004. Pointers, Arrays and Loops

                        • Result:10points,
                        • Rating points-10
                        l
                        • laei
                        • April 23, 2024, 9:17 a.m.

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

                        • Result:50points,
                        • Rating points-4
                        Last comments
                        k
                        kmssrFeb. 8, 2024, 6:43 p.m.
                        Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                        EVA
                        EVADec. 25, 2023, 10:30 a.m.
                        Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                        J
                        JonnyJoDec. 25, 2023, 8:38 a.m.
                        Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                        G
                        GvozdikDec. 18, 2023, 9:01 p.m.
                        Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                        Now discuss on the forum
                        G
                        GarApril 22, 2024, 5:46 a.m.
                        Clipboard Как скопировать окно целиком в clipb?
                        DA
                        Dr Gangil AcademicsApril 20, 2024, 7:45 a.m.
                        Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
                        a
                        a_vlasovApril 14, 2024, 6:41 a.m.
                        Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                        Павел Дорофеев
                        Павел ДорофеевApril 14, 2024, 2:35 a.m.
                        QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                        f
                        fastrexApril 4, 2024, 4:47 a.m.
                        Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

                        Follow us in social networks