Russian Qt Forum
Май 03, 2024, 18:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Qt / Вопросы новичков / Re: Combobox и БД : Июнь 07, 2020, 13:20
Модель кеширует данные сама и не лезет в БД каждый раз.
Простите, не очень понимаю, на что вы намекаете. Типо можно вообще setQuery не делать?
2  Qt / Вопросы новичков / Re: Combobox и БД : Июнь 07, 2020, 12:04
Со старого проекта дернул подключение к БД и накидал вариант решения задачи с использованием QMultiHash ("Multi" на случай, если значения поля Name в таблице повторяются).
С помощью QtDesigner создал виджет и "кинул" на него QComboBox и QPushButton.


P.S.: Единственное не сделал проверку на повторяющиеся значения. Надо будет использовать метод QHash::values(), который возвращают QList(). И уже с этим списком работать... В данном случае будет возвращено только одно значение Id (последнее в QMultiHash). Если точно повторений в таблице нет, то достаточно метода QHash::value(). И совет от новичка в Qt новичку: старайся почаще заглядывать в справку, сначала будет сложно разобраться, придется все-равно часто обращаться к интернету, но со временем станет легче разбираться с материалом и это скажется на быстроте кодинга и эффективности. И не забывай смотреть методы родителей класса, там много интересного Улыбающийся
И еще, советую простые окна (формы) создавать вручную (без QtDesigner) так зачастую проще и меньше лишнего кода. Наследуешься от QWidget, создаешь нужные элементы управления, создаешь нужный Layout, добавляешь в него эти элементы управления и устанавливаешь Layout на данный виджет.
Спасибо за помощь, но мне все-таки не нравится вариант с хранением пары <QString, int> в каком-либо контейнере. Это требует написания лишнего кода, например, как вы уже отметили, в случае, если значения могут повторяться.
Я воспользовался вариантом, который написал demal:
Код:
model = new QSqlQueryModel();
model->setQuery(QString("SELECT -1 as Id, '(Выберите категорию)' as Name UNION SELECT Id, Name FROM Cat WHERE Cat.Art=%1").arg(articleId));
ui->chooseCategory->setModel(model);
ui->chooseCategory->setModelColumn(1);//В комбобоксе отображается содержимое столбца Name
//Если нужно получить Id:
int id = model->record(ui->chooseCategory->currentIndex()).value(0).toInt();
Все просто и лаконично, как мне кажется. К БД обращаемся всего один раз)
3  Qt / Вопросы новичков / Re: Combobox и БД : Июнь 07, 2020, 11:58
ui->Nam->setText(model->record(ui->Fam->currentIndex()).value(3).toString());
То что нужно, спасибо)
4  Qt / Вопросы новичков / Re: Combobox и БД : Июнь 06, 2020, 19:29
После поисков ответов в интернете наткнулся вот на что:
Вроде бы в таких ситуациях, когда надо в комбобоксе отображать данные из БД, используют QSqlQueryModel (как вариант). Я реализовал следующий код:
Код:
    model = new QSqlQueryModel();
    model->setQuery(QString("SELECT -1 as Id, '(Выберите категорию)' as Name UNION SELECT Id, Name FROM Cat WHERE Cat.Art=%1").arg(articleId));
    ui->chooseCategory->setModel(model);
    ui->chooseCategory->setModelColumn(1);
Результатом запроса "SELECT -1 as Id, '(Выберите категорию)' as Name UNION SELECT Id, Name FROM Cat WHERE Cat.Art=%1").arg(articleId)" является два столбца: Id и Name. После того как я вызвал setModelColumn(1), в комбобоксе отображается Name. Теперь, когда мне надо получить Id, я делаю так:

Код:
 ui->chooseCategory->setModelColumn(0);
    int Id = ui->chooseCategory->currentText().toInt();
    ui->chooseCategory->setModelColumn(1);
То есть сначала устанавливаю в модели нулевой столбец, получаю нужный индекс и меняю обратно. Задача выполнена, но однако мне все равно кажется, что это какой-то костыль, и требуемый Id можно получить вообще в одну строчку. Так что вопрос остается открытым)
5  Qt / Вопросы новичков / Combobox и БД : Июнь 06, 2020, 17:39
Доброго времени суток, уважаемые форумчане. Qt начал заниматься недавно. Разрабатываю приложение для ведения расходов.
В моем приложении используется БД SQLITE. В ней есть следующая таблица:

Это Названия категорий расходов. Id - внешний ключ.
На графическом интерфейсе у меня есть Combobox. В него я заношу имена категорий таким образом:
1) Создаю объект QSqlQuery и выполняю запрос в БД на выборку всех имен продуктов.
2) Далее с помощью addItem добавляю это в Combobox.

Далее, в некотором месте программы я хочу получить Id категории в соответствии с тем, что в данный момент выбрано в combobox'е. И вот тут из-за того, что в Qt я новичок, я не совсем понимаю, как грамотно это сделать. В голову приходят следующие идеи:
1) Выполнять SQL-запрос на поиск Id категории по ее имени.
2) Либо где-то в таблице хранить map<Name,Id>. И в нужный момент получить нужный Id по имени.
Очевидно, что оба эти подхода плохие, хочется какого-то более элегантного решения.
Т.е., грубо говоря, чтобы я мог написать ui->combobox->currentText() и получить не имя категории, а именно ее Id.
Надеюсь на вашу помощь.
Страниц: [1]

Страница сгенерирована за 0.054 секунд. Запросов: 24.