M
MadBear54121. März 2017 00:33

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

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

11
Evgenii Legotckoi
  • 21. März 2017 02:15

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

someLineEdit->setText(m_string);

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

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

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

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

    M
    • 21. März 2017 02: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. März 2017 10:17

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

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

        M
        • 21. März 2017 21:21

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

          Evgenii Legotckoi
          • 21. März 2017 22:21

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

            M
            • 21. März 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. März 2017 00:08

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

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

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

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

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

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

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

                M
                • 23. März 2017 00:25

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

                  Evgenii Legotckoi
                  • 23. März 2017 00:37
                  • Die Antwort wurde als Lösung markiert.

                  Под сырым 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. März 2017 00:42

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

                      Evgenii Legotckoi
                      • 23. März 2017 00:43

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

                        Kommentare

                        Nur autorisierte Benutzer können Kommentare posten.
                        Bitte Anmelden oder Registrieren
                        Letzte Kommentare
                        A
                        ALO1ZE19. Oktober 2024 08:19
                        Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                        ИМ
                        Игорь Максимов5. Oktober 2024 07:51
                        Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                        d
                        dblas55. Juli 2024 11:02
                        QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                        k
                        kmssr8. Februar 2024 18:43
                        Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                        Jetzt im Forum diskutieren
                        J
                        JacobFib17. Oktober 2024 03:27
                        добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                        JW
                        Jhon Wick1. Oktober 2024 15:52
                        Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                        КГ
                        Кирилл Гусарев27. September 2024 09:09
                        Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                        F
                        Fynjy22. Juli 2024 04:15
                        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                        Folgen Sie uns in sozialen Netzwerken