Юрий
Юрий1 сентября 2017 г. 17:14

Как остаться на выбранной позиции при обновление данных в comboBox

На форме имеются несколько combobox и при изменении, добавление в справочник данных необходимо обновлять эти combobox. Как остать на выбранной позиции и обновить данные в combobox. Данные берутся из бд mysql/

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

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

19
Evgenii Legotckoi
  • 2 сентября 2017 г. 5:34

Что значит остаться на выбранной позиции?
Не видя код, проблематично что-то советовать по этому вопрос. Вопрос ситуативен.
По факту можно ответить так. Когда изменяются данные, кидаете сигнала о том, что данные изменились. В обработчике сигнала работаете с ComboBox`ами и прописываете логику по изменению этих комбобоксов с учётом требований.

    Юрий
    • 4 сентября 2017 г. 0:38

    Например, есть список:

    1. Яблоки
    2. Помидоры
    3. Бананы
    Я выбираю 2.помидоры, но когда в этот список добавилось еще одно наименование 4. Абрикосы и combobox обновил данные то переходит на первый пункт.
      Юрий
      • 4 сентября 2017 г. 0:45

      Заполнение combobox

        QSqlQuery * qry_type = new  QSqlQuery (conn.mydb);
        qry_type->prepare("select id_type, name_type from type");
        qry_type->exec();
        ui->comboBox_type->addItem("");
        while (qry_type->next())
        ui->comboBox_type->addItem(qry_type->value(1).toString(), qry_type->value(0).toInt());
      Получаю id записи тип
      void ArrivalDialog::on_comboBox_type_currentIndexChanged(int index)
      {
          type_tech= ui->comboBox_type->itemData(index).toInt();
      }
        Evgenii Legotckoi
        • 4 сентября 2017 г. 1:20
        • (ред.)

        Я так понимаю, Вы предварительно где-то очищаете данные в ComboBox, а потом уже заново добавляете полный список. Поэтому у Вас и сбивается индекс. Если не удалять данные, то индекс остаётся прежний.
        Один из вариантов, которые Вы можете использовать, так это сохранять текущий индекс через метод QComboBox::currentIndex() в некоторую переменную, а потом уже устанавливать индекс заново после добавления списка данных.
        А ещё, я мог бы посоветовать Вам использовать модель данных и QDataWidgetMapper . Ведь судя по всему у Вас там некоторая форма ввода используется...

        Посмотрите статью с использованием QDataWidgetMapper .
          Юрий
          • 4 сентября 2017 г. 1:36

          Да я очищаю иначе у меня дублируются записи.  При заполнении combobox из модели, как мне потом получить id записи?

            Evgenii Legotckoi
            • 4 сентября 2017 г. 1:52

            У QDataWidgetMapper также есть метод currentIndex() , который вернёт фактически номер строки в модели данных. Этот номер строки можно использовать через QModelIndex и метод модели data() для получения любой информации из строки в модели данных, в том числе и id в базе данных.

            model->data(model->index(mapper->currentIndex(), someColumn)).toInt();
            Должно получиться что-то типо такого.
            Вообще по возможности используйте модели данных. Поначалу, конечно, мороки много, но потом просто милое дело получается. Всё аккуратно и красиво выходит.
              Юрий
              • 4 сентября 2017 г. 4:56

              Сделал так

              model_type = new QSqlTableModel(this);
              model_type->setTable("type");
              model_type->select();
              ui->comboBox_type->setModel(model_type);
              ui->comboBox_type->setModelColumn(1);


                Юрий
                • 4 сентября 2017 г. 5:06

                Как подключить сигнал?


                 connect(mapper,SIGNAL(currentIndexChanged(int)),this, SLOT(mapper_currentIndexChanged(int)));

                  Evgenii Legotckoi
                  • 4 сентября 2017 г. 5:15

                  mapper создали через выделение памяти в куче? то есть через оператор new ?
                  Если нет, то перед маппером должен быть амперсанд.

                  connect(&mapper,SIGNAL(currentIndexChanged(int)),this, SLOT(mapper_currentIndexChanged(int)));
                    Юрий
                    • 4 сентября 2017 г. 5:35

                    Вот так

                    mapper = new QDataWidgetMapper();
                    mapper->setModel(model_type);
                    
                      Evgenii Legotckoi
                      • 4 сентября 2017 г. 5:57
                      • (ред.)

                      Ну тогда подключайте сигнал, как показали. Разве только можно в нотации Qt5 его переписать, через указатели.
                      Хотя, если Вы модель установили прямо в ComboBox, то можно и без маппера обойтись, просто делать update модели, когда добавлены новые данные.

                        Юрий
                        • 4 сентября 2017 г. 6:02

                        Получается он не посылает сигнал?

                        QObject::connect: No such signal QObject::dataChanged(QModelIndex,QModelIndex,QVector<int>)
                          Evgenii Legotckoi
                          • 4 сентября 2017 г. 6:14

                          Это что-то новенькое... не найден сигнал в модели. dataChanged - это сигнал, который объявлен в QAbstractItemModel.

                          Может заголовочники не все подключили?
                            Юрий
                            • 4 сентября 2017 г. 12:01

                            Не понимаю как добавить в combobox

                            mapper->addMapping(ui->comboBox_type,1, "currentIndex");
                            и еще есть "currentTetxt"
                              Evgenii Legotckoi
                              • 4 сентября 2017 г. 15:25

                              Проверьте currentText , возможно проблема в том, что property currentIndex имеет перегруженный сигнал currentIndexChanged.

                                Юрий
                                • 4 сентября 2017 г. 17:21
                                    model_type = new QSqlTableModel(this);
                                    model_type->setTable("type");
                                    model_type->setEditStrategy(QSqlTableModel::OnManualSubmit);
                                    int type_id = model_type->fieldIndex("id_type");
                                    model_type->select();
                                
                                    ui->comboBox_type->setModel(model_type);
                                    ui->comboBox_type->setModelColumn(model_type->fieldIndex("name_type"));
                                
                                    mapper = new QDataWidgetMapper(this);
                                    mapper->setModel(model_type);
                                    mapper->addMapping(ui->lineEdit_type, type_id);
                                Теперь у меня есть id записи  в line_edit. Можно как-то сразу перенести в переменную int?
                                При обновление модели так же выбирается первая строчка.
                                Мне нужно как то хранить индекс записи для вставки после обновления модели
                                ui->comboBox_type->setCurrentIndex(int);

                                  Evgenii Legotckoi
                                  • 5 сентября 2017 г. 2:34
                                  • Ответ был помечен как решение.

                                  хм. печально, что не заработало, как предполагалось.

                                  line_edit может вернуть свой текст через метод text(), этот метод возвращает обьект типа QString , который с помощью метода toInt() можно преобразовать в целочисленный тип int .
                                    Юрий
                                    • 7 сентября 2017 г. 5:59

                                    Да это понятно. Просто у меня на форме много combobox-ов.

                                      Юрий
                                      • 7 сентября 2017 г. 13:05

                                      Все сделал.  Применил костыли.

                                      Храню все в line_edit.
                                      ui->comboBox_type->setCurrentIndex(model_type->match(model_type->index(0,0,QModelIndex()),Qt::DisplayRole,ui->lineEdit_type->text().toInt(),1,Qt::MatchExactly).first().row());
                                      Спасибо.

                                        Комментарии

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

                                        C++ - Тест 002. Константы

                                        • Результат:16баллов,
                                        • Очки рейтинга-10
                                        B

                                        C++ - Тест 001. Первая программа и типы данных

                                        • Результат:46баллов,
                                        • Очки рейтинга-6
                                        FL

                                        C++ - Тест 006. Перечисления

                                        • Результат:80баллов,
                                        • Очки рейтинга4
                                        Последние комментарии
                                        k
                                        kmssr9 февраля 2024 г. 5:43
                                        Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                        АК
                                        Анатолий Кононенко5 февраля 2024 г. 12:50
                                        Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                        EVA
                                        EVA25 декабря 2023 г. 21:30
                                        Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                        J
                                        JonnyJo25 декабря 2023 г. 19:38
                                        Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                        G
                                        Gvozdik19 декабря 2023 г. 8:01
                                        Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                        Сейчас обсуждают на форуме
                                        P
                                        Pisych27 февраля 2023 г. 15:04
                                        Как получить в массив значения из связанной модели? Спасибо, разобрался:))
                                        AC
                                        Alexandru Codreanu19 января 2024 г. 22:57
                                        QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
                                        BlinCT
                                        BlinCT27 декабря 2023 г. 19:57
                                        Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
                                        Дмитрий
                                        Дмитрий10 января 2024 г. 15:18
                                        Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
                                        Evgenii Legotckoi
                                        Evgenii Legotckoi12 декабря 2023 г. 17:48
                                        Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

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