M
MadBear541Наурыз 21, 2017, 12: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, 9:21 Т.Қ.

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

          Evgenii Legotckoi
          • Наурыз 21, 2017, 10:21 Т.Қ.

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

            M
            • Наурыз 21, 2017, 10: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, 12:08 Т.Ж.

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

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

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

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

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

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

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

                M
                • Наурыз 23, 2017, 12:25 Т.Ж.

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

                  Evgenii Legotckoi
                  • Наурыз 23, 2017, 12: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, 12:42 Т.Ж.

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

                      Evgenii Legotckoi
                      • Наурыз 23, 2017, 12:43 Т.Ж.

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

                        Пікірлер

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

                        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 Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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