M
MadBear54121 марта 2017 г. 0:33

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

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

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

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

11
Evgenii Legotckoi
  • 21 марта 2017 г. 2:15

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

someLineEdit->setText(m_string);

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

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

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

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

    M
    • 21 марта 2017 г. 2:25

    есть 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
      • 21 марта 2017 г. 10:17

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

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

        M
        • 21 марта 2017 г. 21:21

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

          Evgenii Legotckoi
          • 21 марта 2017 г. 22:21

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

            M
            • 21 марта 2017 г. 22:39

            выше я уже приводил код в котором формируется модель для данных в 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
              • 23 марта 2017 г. 0:08

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

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

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

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

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

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

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

                M
                • 23 марта 2017 г. 0:25

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

                  Evgenii Legotckoi
                  • 23 марта 2017 г. 0:37
                  • Ответ был помечен как решение.

                  Под сырым 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
                    • 23 марта 2017 г. 0:42

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

                      Evgenii Legotckoi
                      • 23 марта 2017 г. 0:43

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

                        Комментарии

                        Только авторизованные пользователи могут публиковать комментарии.
                        Пожалуйста, авторизуйтесь или зарегистрируйтесь
                        AD

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

                        • Результат:50баллов,
                        • Очки рейтинга-4
                        m
                        • molni99
                        • 26 октября 2024 г. 7:37

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

                        • Результат:80баллов,
                        • Очки рейтинга4
                        m
                        • molni99
                        • 26 октября 2024 г. 7:29

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

                        • Результат:20баллов,
                        • Очки рейтинга-10
                        Последние комментарии
                        i
                        innorwall14 ноября 2024 г. 17:42
                        Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                        i
                        innorwall14 ноября 2024 г. 15:09
                        Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                        i
                        innorwall14 ноября 2024 г. 10:05
                        EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
                        i
                        innorwall14 ноября 2024 г. 10:00
                        PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты) priligy 30mg Am J Obstet Gynecol 171 1488 505
                        Сейчас обсуждают на форуме
                        i
                        innorwall14 ноября 2024 г. 9:39
                        добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                        i
                        innorwall11 ноября 2024 г. 16:55
                        Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                        9
                        9Anonim25 октября 2024 г. 15:10
                        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                        ИМ
                        Игорь Максимов3 октября 2024 г. 10:05
                        Реализация навигации по разделам Спасибо Евгений!

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