Юрий
Юрий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());
                                      Спасибо.

                                        Комментарии

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

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

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

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

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

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

                                        • Результат:20баллов,
                                        • Очки рейтинга-10
                                        Последние комментарии
                                        i
                                        innorwall14 ноября 2024 г. 8:03
                                        Как написать игру на Qt - Урок 3. Взаимодействие с другими объектами what is priligy tablets What happens during the LASIK surgery process
                                        i
                                        innorwall14 ноября 2024 г. 5:09
                                        Использование переменных объявленных в CMakeLists.txt внутри C++ файлов where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
                                        i
                                        innorwall12 ноября 2024 г. 7:12
                                        Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                                        i
                                        innorwall12 ноября 2024 г. 3:23
                                        QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                                        i
                                        innorwall12 ноября 2024 г. 0:50
                                        Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                                        Сейчас обсуждают на форуме
                                        i
                                        innorwall14 ноября 2024 г. 9:39
                                        добавить qlineseries в функции Listen intently to what Jerry says about Conditional Acceptance because that s the bargaining chip in the song and dance you will have to engage in to protect yourself and your family from AMI S…
                                        i
                                        innorwall11 ноября 2024 г. 19: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 г. 17:10
                                        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                                        ИМ
                                        Игорь Максимов3 октября 2024 г. 12:05
                                        Реализация навигации по разделам Спасибо Евгений!

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