Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 09.04.2019
Сообщений: 53

Заполнить combobox данными из txt файла

31.10.2022, 20:43. Показов 4537. Ответов 36

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть вопрос по заполнению combobox в qt creator. Мне нужно его заполнить данными из txt файла, перерыл множество источником, мало что про это написано, большинство заполняют из бд. Мне нужно просто заполнить его из txt файла. Заполнять его данными в коде неудобно, проще исправить txt файл и загрузить заново. Буду рад, если кто может подсказать или показать пример. Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2022, 20:43
Ответы с готовыми решениями:

Заполнить dataGridView данными из txt файла
Доброго времени суток.Есть txt файл вида: 5,742 38,445 52,173 20,416 28,3305 18,106 5,2965 37,818 51,986 45,738 26,3615 17,9135...

ComboBox Заполнить из txt файла
Доброго времени суток. Я начинающий поэтому просьба не забрасывать тапками. Суть вопроса - есть MFC проект, есть ComboBox его надо...

Заполнить combobox из файла txt
Здравствуйте Коллеги! Прошу помочь в решении следующей ситуации. Есть форма с combobox по замыслу заполняется из файла.txt (одна...

36
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
01.11.2022, 20:55
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Антон___ Посмотреть сообщение
просто из-за создания форм в коде, немного путаница в голове,
Кликните здесь для просмотра всего текста
Смотрите, создали форму в дизайнере, накидали виджетов.
Пишите в конструкторе MainWindow
C++ (Qt)
1
2
3
4
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
     ui->
Как только напишите ui-> креатор выдаст выпадающий список виджетов на форме.
Что бы не писать постоянно ui->, можно сделать указатель на виджет.
Например на форме есть виджет comboBox1
Пишите QComboBox* combo1=ui->comboBox1;
Теперь вы можете обращаться к виджету, созданному в дизайнере, как combo1


Заморочился, переделал пример:
Кликните здесь для просмотра всего текста

-Постарался максимально комментировать, если что не ясно-спрашивайте, этот код наверное сложноват для новичка
-Заменил текстовый файл на .ini файл QSettings, он практически то же, что и .txt
для того, чтобы в один файл можно было записывать данные от нескольких комбобоксов (и вообще любую инфу),
а так же с заделом на будущее, предполагая замену или удаление полей в комбобоксе.
-QSettings -самый простой способ сохранения в файл параметров "ключь-значение", и не надо париться с парсингом обычного текстового файла.

Файл выглядит так:
[combo2]
1=1
2=2
3=3

[combo1]
1=one
2=two
3=three
Mожете зарание создать его, или сгенерить, запустив пример
Если сделаете его зарание, при запуске примера должны заполнится комбобоксы этими значениями.


пример:
Кликните здесь для просмотра всего текста

-Создайте проект без формы(снимите галочку "создать форму"), замените код в указанных файлах
-Создайте .ini файл и укажите путь к нему в коде. Можете заполнить по шаблону выше
-На форме два комбобокса и соотв. им поля ввода.
-Вводите текст в поле ввода, нажимаете энтер-этот текст вставляется
как поле в комбобокс, и записывается в файл.
-После заполнения комбобоксов можете закрыть и запустить пример заново,
введенные значения должны появиться в комбобоксах(прочитаться из файла)


mainwindow.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
class QComboBox;
class QLineEdit;
class QSettings;
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private:
    QComboBox *combo1, *combo2;
    QLineEdit *edit1, *edit2;
    QSettings *settings;
 
private:
    inline void initUI();
    void load(QComboBox* combo, QString comboName);
};
#endif // MAINWINDOW_H
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "mainwindow.h"
 
#include <QComboBox>
#include <QGridLayout>
#include <QLineEdit>
#include <QSettings>
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    initUI();
    //задайте ниже свой путь к файлу
    settings=new QSettings("e:/txt.ini",  QSettings::IniFormat);
    settings->setParent(this);
 
    //в ф-и init() заданы обьектные имена комбобоксов, что бы
    //по этим именам сохранялись и читались данные в файле
    //читаем данные из файла, если они были сохранены
    load(combo1, combo1->objectName());
    load(combo2, combo2->objectName());
 
 
    //пишу коннекты с лямбдами, потому что так гораздо проще, и меньше кода
    //когда введен текст в поле ввода и нажат энтер, выполняется код ниже.
    connect(edit1, &QLineEdit::returnPressed,this, [this]{
 
        QString text=edit1->text();//получаем текст из поля ввода
        combo1->addItem(text);//добавляем его в комбобокс
        edit1->clear();
        //записываем текст в файл, в группу этого комбобокса ("combo1") 
        settings->beginGroup(combo1->objectName());
        settings->setValue(QString::number(combo1->count()), text);
        //ключь=номер добавленного поля в комбобоксе
        //значение=текст из поля ввода
        settings->endGroup();
    });
 
    connect(edit2, &QLineEdit::returnPressed,this, [this]{
 
        QString text=edit2->text();
        combo2->addItem(text);
        edit2->clear();
        settings->beginGroup(combo2->objectName());
        settings->setValue(QString::number(combo2->count()), text);
        settings->endGroup();
    });
}
 
 
void MainWindow::load(QComboBox* combo, QString comboName)
{
    settings->beginGroup(comboName);//открываем группу комбобокса
 
    const auto keys=settings->allKeys();//забираем ключи всех записей
    for(const auto &key : keys)
        combo->insertItem(key.toInt(), settings->value(key).toString());
     //проходимся по всем полям группы и закидываем их в комбобокс
 
     settings->endGroup();
 
}
 
 
void MainWindow::initUI()
{
    auto form=new QWidget;
    auto layout=new QGridLayout;
    form->setLayout(layout);
    setCentralWidget(form);
 
    combo1=new QComboBox;
    combo2=new QComboBox;
    edit1=new QLineEdit;
    edit2=new QLineEdit;
 
    combo1->setObjectName("combo1");
    combo2->setObjectName("combo2");
 
    layout->addWidget(combo1,0,0);
    layout->addWidget(edit1,0,1);
    layout->addWidget(combo2,1,0);
    layout->addWidget(edit2,1,1);
}
 
MainWindow::~MainWindow()
{
}
0
1 / 1 / 0
Регистрация: 09.04.2019
Сообщений: 53
02.11.2022, 08:32  [ТС]
sdf45, Спасибо за старания!) Начинаю понимать, но, в примере комбобоксы заполняете из полы вода, можно ли без поля ввода обойтись, просто загрузить файл в комбобоксы и там появятся элементы?Спасибо!

Добавлено через 7 минут
sdf45, Спасибо за старания!) Начинаю понимать, но, в примере комбобоксы заполняете из полы вода, можно ли без поля ввода обойтись, просто загрузить файл в комбобоксы и там появятся элементы?Спасибо!

Т.е получается так, что у меня на форме только два комбобокса и нет поля ввода, мне просто нужно вставить в каждый комбобокс файл с содержимым.
Тут пример хороший и познавательный привели. Но интересует строка: combo1=new QComboBox;
combo2=new QComboBox; Здесь Вы создаете отдельно два комбобокса, а если их создать сразу на форме, без кода,просто перенести, то к ним обратиться как нужно. Есть название: comboBox, comboBox_2, мы должны эти два виджета проинициализировать и обратиться, вот как правильно сделать?
Спасибо!!
1
 Аватар для Ender Che
521 / 411 / 77
Регистрация: 29.05.2018
Сообщений: 1,363
02.11.2022, 09:04
Цитата Сообщение от Антон___ Посмотреть сообщение
а если их создать сразу на форме, без кода,просто перенести, то к ним обратиться как нужно
C++ (Qt)
1
2
ui->combo1->...;
ui->combo2->...;
0
1 / 1 / 0
Регистрация: 09.04.2019
Сообщений: 53
02.11.2022, 09:06  [ТС]
[nick]Ender Che[/nick так не работает, неизвестная переменная пишет
0
 Аватар для Ender Che
521 / 411 / 77
Регистрация: 29.05.2018
Сообщений: 1,363
02.11.2022, 09:16
Цитата Сообщение от Антон___ Посмотреть сообщение
так не работает, неизвестная переменная пишет
Всё зависит от того, как вы инициализировали форму и какие имена давали (если вообще давали) своим комбобоксам на форме.

Мой совет такой же, как у уважаемого sdf45 - вначале освойте "накидывание" виджетов чисто через код, а уж потом занимайтесь "формошлёпством".
1
1 / 1 / 0
Регистрация: 09.04.2019
Сообщений: 53
02.11.2022, 09:18  [ТС]
Ender Che, через код я понял как делать, да работает, но хочется понять как с формой все это работает, имена comboBox, comboBox_2
Просто интересует, обратиться к виджету не проблема, все, но нужно ли создавать слот под комбы, функция ввода информации в комбы интересует, непосредственно на виджеты уже находящиеся на форме
0
 Аватар для Ender Che
521 / 411 / 77
Регистрация: 29.05.2018
Сообщений: 1,363
02.11.2022, 09:25
Антон___, попробую догадаться (без кода инициализации формы):
C++ (Qt)
1
2
ui->comboBox->...;
ui->comboBox_2->...;
0
1 / 1 / 0
Регистрация: 09.04.2019
Сообщений: 53
02.11.2022, 09:30  [ТС]
Ender Che, да обращение такое, пробовал кодом добавить элементы все работает, но, нужна функция addItem, ее лучше описывать отдельно,создать строковую переменную и потом ее передать в параметр ui->comboBox->addItem(строковая переменная)
0
 Аватар для Ender Che
521 / 411 / 77
Регистрация: 29.05.2018
Сообщений: 1,363
02.11.2022, 09:37
Цитата Сообщение от Антон___ Посмотреть сообщение
нужна функция addItem, ее лучше описывать отдельно,создать строковую переменную и потом ее передать в параметр ui->comboBox->addItem(строковая переменная)
Вы что-то перемудрили. У комбобокса уже есть void QComboBox::addItem(const QString &text, const QVariant &userData = QVariant()).
1
1 / 1 / 0
Регистрация: 09.04.2019
Сообщений: 53
02.11.2022, 11:48  [ТС]
Ender Che, можно пример самый простой, как в этом функции реализовать заполнение comboBox из файла? sdf45,
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
02.11.2022, 11:58
Цитата Сообщение от Антон___ Посмотреть сообщение
можно ли без поля ввода обойтись, просто загрузить файл в комбобоксы и там появятся элементы?
Да. Есть ф-я load()
Кликните здесь для просмотра всего текста
Цитата Сообщение от sdf45 Посмотреть сообщение
C++ (Qt)
1
void load(QComboBox* combo, QString comboName);
Делаете файл с расширением ini, записываете туда инфу для комбобоксов
[combo1] <-название группы
1=one <-данные группы
2=two
...
[combo2]
1=cat
2=dog
3=pig
Вызываете load(комбобокс, "название группы") например
load(comboBox1, "combo1")
И при старте приложения в комбобоксе comboBox1 появятся строчки "one two "

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

Цитата Сообщение от Антон___ Посмотреть сообщение
Здесь Вы создаете отдельно два комбобокса
Указатели на комбобоксы. Просто чтобы каждый раз не добавлять ui-> перед именем виджета.
Как я уже писал, создаете в дизайнере виджеты на форме. Можете дать им свои имена, либо они генярятся автоматически. Доступ в программе к таким виджетам идет через ui->
Попробуйте для начала создать пустой проект с формой, разберитесь, как работать с виджетами в программе. Есть на ютубе уроки хорошие от Evileg, посмотрите. Пробуйте так же создавать виджеты вручную, что бы пришло понимание происходящего, когда создаете виджеты в дизайнере. Ознакомтесь с механикой сигналов и слотов, тогда поймете, что происходит, когда в дизайнере добавляется реакция на, например, нажатие кнопки.

Добавлено через 7 минут
Цитата Сообщение от Антон___ Посмотреть сообщение
можно пример самый простой, как в этом функции реализовать заполнение comboBox из файла?
в посте 21 уже все есть, просто уберите QLineEdit`ы и коннекты к ним если не нужны, останутся два комбобокса, заполняемые данными из файла при старте приложения
0
 Аватар для Ender Che
521 / 411 / 77
Регистрация: 29.05.2018
Сообщений: 1,363
02.11.2022, 12:12
Цитата Сообщение от Антон___ Посмотреть сообщение
можно пример самый простой, как в этом функции реализовать заполнение comboBox из файла?
Не тестировал, возможны ошибки:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
QString result;
 
QFile file(nameFile);
if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    QTextStream stream(&file);
    result = stream.readAll();
    file.close();
}
 
QStringList list = result.split("\n");
 
for(QString str : list)
{
    ui->comboBox->addItem(str);
}
0
1 / 1 / 0
Регистрация: 09.04.2019
Сообщений: 53
10.11.2022, 08:45  [ТС]
sdf45, можете пожалуйста посмотреть и подправить, не получается по Вашим инструкциям, извините, если задергал? Вернулся к больной теме, но очень хочу добить ее))
Вложения
Тип файла: 7z _Anket (1).7z (330.1 Кб, 6 просмотров)
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
10.11.2022, 12:45
Антон___, Вам всего то и надо было:
1.Добавить функцию загрузки из файла в класс anket
Кликните здесь для просмотра всего текста

.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef ANKET_H
#define ANKET_H
 
#include <QMainWindow>
 
class QComboBox;
 
namespace Ui {
class Anket;
}
 
class Anket : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit Anket(QWidget *parent = 0);
    ~Anket();
    QString FirstUpper(QString str);
 
private slots:
    void on_pushButton_3_clicked();
    void on_pushButton_2_clicked();
    void on_pushButton_clicked();
 
private:
    Ui::Anket *ui;
 
private:
    bool load(QString path, QComboBox* combo);//обьявить
};
 
#endif // ANKET_H
.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//добавить реализацию
 
#include "anket.h"
#include "ui_anket.h"
 
#include <QFile>
#include <QComboBox>
#include <QTextStream>
#include <QLineEdit>
#include <QGridLayout>
#include <QFileDialog>
//...
bool Anket::load(QString path, QComboBox *combo)
{
    if(path.isEmpty() || !combo)
        return false;
 
    QFile file(path);
    if (file.open(QIODevice::ReadOnly | QIODevice::Text)){
 
        QTextStream in(&file);
        combo->addItems(in.readAll().split("\n"));
        return true;
    }else
        return false;
}
//...


2. Вызвать ф-ю загрузки в конструкторе класса anket для комбобокса на ui
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
Anket::Anket(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Anket)
{
    ui->setupUi(this);
    load(":/employees.txt", ui->comboBox);
}


3. Соответственно файл main.cpp выглядит
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
#include "anket.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Anket w;
    w.show();
    return a.exec();
}


Так же:
4. Насколько я понимаю, загружать надо из файла "сотрудники.txt", который должен быть добавлен в ресурсы.
Заменил его название на "employees.txt", добавил этот файл в новый ресурсный файл по префиксу "/"
(у Вас какой-то многоэтажный ресурсный файл, содержащий опять же ресурсный файл...)
5. Остальной код не проверял.

Добавлено через 18 минут
зы забыл файл закрыть
C++ (Qt)
1
2
3
4
5
6
7
8
...
if (file.open(QIODevice::ReadOnly | QIODevice::Text)){
 
        QTextStream in(&file);
        combo->addItems(in.readAll().split("\n"));
        file.close();//<------
        return true;
...
0
1 / 1 / 0
Регистрация: 09.04.2019
Сообщений: 53
10.11.2022, 15:37  [ТС]
sdf45, на второй комбо и остальные тоже нужно класс создавать? С тем комбобоксом все получилось, но выводятся иероглифы, а не русский, в кодировке выбрал UTF-8, все равно иероглифы. У меня QT 5.12
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
10.11.2022, 16:10
Лучший ответ Сообщение было отмечено Антон___ как решение

Решение

Цитата Сообщение от Антон___ Посмотреть сообщение
второй комбо и остальные тоже нужно класс создавать?
Антон___,
нет, зачем... Вы с++ впервые видите или это какой-то тонкий троллинг?
Действуйте по аналогии с примером, - как загрузился текст в один комбобокс, так можно загрузить в любой другой,
load(путь к файлу, ui-> второй комбо);
Такие вопросы относятся скорее к азам с++ , чем Qt, у меня не получится научить Вас языку с++

Цитата Сообщение от Антон___ Посмотреть сообщение
выводятся иероглифы
у меня тоже выводились с Вашим файлом, более того, даже при попытке открытия Вашего проекта, креатор послал меня нафиг. Я хз, что там за конская кодировка была, поэтому файл сотрудников сам сделал тупо в блокноте, .срр файл тоже открыл в блокноте , переписал(кириллицей же) все, что было кирилицей, и только тогда смог открыть его в креаторе.
0
1 / 1 / 0
Регистрация: 09.04.2019
Сообщений: 53
16.11.2022, 13:03  [ТС]
sdf45, спасибо))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2022, 13:03

Заполнить массив для от сортировки данными из файла "text.txt"
Добрый день. У меня есть код, размер и данные массива вводятся с клавиатуры пользователем. Я попытался его переделать так, чтобы данные...

Заполнить combobox данными относительно другого combobox
Ребята в общем надо заполнить combobox данными относительно другого combobox... я написал такой участок и выдаёт следующею ошибку. ...

Дополнить .txt файл из другого .txt файла недостающими данными
Доброго времени суток. Подскажите как осуществить такую операцию с текстовым файлом. К примеру, первый файл обновляется с сайта и...

Заполнить comboBox данными из Excel
Добрый день, уважаемые знатоки :) Прошу сильно не пинать, форум почитал, но не разобраться :-( Есть на форме комбобокс, значения для...

Заполнить Combobox данными из столбца БД
Добрый день :curtsy:! Я новичок в VB 6.0. Подскажите, как в VB 6.0 реализовать след. задачку: на форме размещен Combobox . Нужно, чтобы в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru