запись пользовательского ввода в строковый массив из editLine - PullRequest
0 голосов
/ 31 октября 2019

Создание простого графического интерфейса в QT. Я хочу собирать список строк каждый раз, когда пользователь вставляет имя с помощью кнопки вставки. Я получил необработанную логику для работы с cli, однако это не то же самое, когда я конвертирую логику в QT / C ++, потому что программа просто принудительно закрывается. Я использую lineEdit из входных виджетов. Что я делаю неправильно и что могло бы быть лучшей альтернативой?

CLI Logic:

std::cout<<"Enter a name\tor enter nothing to quit"<<std::endl
<<">>>"; 
getline(std::cin, getNames);
listOfNames[enteredNames] = getNames;

while(getNames.length() > 0){
    enteredNames++;

    std::cout<<"Enter another name\tor enter nothing to quit"<<std::endl
    <<">>>"; 
    getline(std::cin, getNames);
    listOfNames[enteredNames] = getNames;
}

QT Logic:

void MainWindow ... buttonClicked(){
  v.namesEntered = 0;
  v.listOfNames[50]={0};

  v.getNames = ui->nameInputBox->text().toStdString();
  while(v.getNames.length() > 0){
    v.namesEntered++;
    v.listOfNames[v.namesEntered] = v.getNames;
  }
}

Если вам интересноТочечные обозначения в данных v объясняются тем, что я создал структуру в mainwindow.h и хотел, чтобы мои переменные были глобальными для других функций.

1 Ответ

0 голосов
/ 31 октября 2019

Вы не показали, что v.listOfNames объявлено как, но это как статический массив, верно? Вместо этого вы должны использовать std::vector<std::string>.

В любом случае, в вашем коде QT ваш while цикл выполняется бесконечно, если пользователь вводит непустую строку, так как вы не изменяете v.getNamesтак что его length() может уменьшаться со временем. Вам, вероятно, вообще не нужен цикл while, если пользователь может вводить только 1 строку за нажатие кнопки.

Кроме того, вы увеличиваете namesEntered слишком рано и не проверяете, когда namesEntered превышаетграницы listOfNames, если это действительно статический массив.

Попробуйте вместо этого нечто большее:

CLI

enteredNames = 0;
...
std::cout << "Enter a name\tor enter nothing to quit" << std::endl << ">>>"; 
while (getline(std::cin, getNames) && !getNames.empty())
{
    listOfNames[enteredNames] = getNames;
    ++enteredNames;

    std::cout << "Enter another name\tor enter nothing to quit" << std::endl << ">>>"; 
}

QT

void MainWindow ... initialize(){
    v.namesEntered = 0;
}

void MainWindow ... buttonClicked(){
    v.getNames = ui->nameInputBox->text().toStdString();
    if (!v.getNames.empty()) {
        if (v.namesEntered >= std::size(v.listOfNames)) {
            // the list is full, do something else ...
        }
        else {
            v.listOfNames[v.namesEntered] = v.getNames;
            v.namesEntered++;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...