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
                        AD

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

                        • Result:50points,
                        • Rating points-4
                        m

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

                        • Result:80points,
                        • Rating points4
                        m

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

                        • Result:20points,
                        • Rating points-10
                        Last comments
                        Evgenii Legotckoi
                        Evgenii LegotckoiOct. 31, 2024, 9:37 p.m.
                        Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                        A
                        ALO1ZEOct. 19, 2024, 3:19 p.m.
                        Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                        ИМ
                        Игорь МаксимовOct. 5, 2024, 2:51 p.m.
                        Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                        d
                        dblas5July 5, 2024, 6:02 p.m.
                        QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                        k
                        kmssrFeb. 9, 2024, 2:43 a.m.
                        Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        Now discuss on the forum
                        Evgenii Legotckoi
                        Evgenii LegotckoiJune 24, 2024, 10:11 p.m.
                        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                        t
                        tonypeachey1Nov. 15, 2024, 2:04 p.m.
                        google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                        NSProject
                        NSProjectJune 4, 2022, 10:49 a.m.
                        Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                        9
                        9AnonimOct. 25, 2024, 4:10 p.m.
                        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                        Follow us in social networks