QtableView и модель в бесконечном цикле while - PullRequest
0 голосов
/ 14 марта 2020

У меня есть QTableview. У меня есть прикрепленная к нему модель. У меня есть бесконечное время l oop, в котором я отправляю и получаю сообщения с сервера. Когда я получаю сообщение, я хочу добавить строку в свою таблицу.
Моя проблема в том, что я не могу заставить эту идею работать. Когда я делаю while (true), это не работает.
Я был бы признателен, если бы кто-то мог мне помочь.
Вот фрагмент кода, о котором я говорю:

model = new QStandardItemModel(4,1,this);
ui->tableView->setModel(model);
ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);

while (true)
{
    // Server response
    reciever_input.wait_for_recieve();

    std::vector<std::string> res = decode_msg(_serverResponse.front());

    unsigned int it;
    it = 8;

    if (res[0] == "Y")
    {
        int row = 0;
        //here I want to add rows in my table
        for (; it < res.size(); it++, row++)
        {
            std::string temp = res[it]; // this is the string that I want to add
            QString qtemp = QString::fromUtf8(temp.c_str());
            QModelIndex index = model->index(row,0,QModelIndex());
            model->setData(index,qtemp);
        }
    }
    if (res[0] == "L")
        break;
}

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Вам не хватает insertRow() внутри вашего for l oop. Пожалуйста, прочитайте документацию здесь .

Я сам не тестировал код, но он должен выглядеть примерно так, как показано ниже:

while (true)
{
    // Server response
    reciever_input.wait_for_recieve();

    std::vector<std::string> res = decode_msg(_serverResponse.front());

    unsigned int it;
    it = 8;

    if (res[0] == "Y")
    {
        int row = 0;
        //here I want to add rows in my table
        for (; it < res.size(); it++, row++)
        {
            std::string temp = res[it]; // this is the string that I want to add
            QString qtemp = QString::fromUtf8(temp.c_str());

            // insert row into the model 
            model->insertRow(row, new QStandardItem(qtemp));
        }
    }
    if (res[0] == "L")
        break;
    }

EDIT 1:

Установка int row = 0 будет перезаписывать строки каждый раз, когда вы получаете новый std::vector<std::string>. Вам решать, как вы хотите использовать этот кусок кода.

0 голосов
/ 15 марта 2020

Вы пытались создать новую тему для подключения к серверу? Я думаю, что вы должны запустить его как второй поток в фоновом режиме, и в случае необходимости обновления вашей модели.

вы можете найти здесь qt do c

Вы также можете найти хорошие примеры в youtube


дополнительная идея:

MarKS имеет право, что-то отсутствует в вашем коде. Используйте этот код для вставки строки в конце модели:

int rowNr;
rowNr = model->rowCount();  
model->insertRow(rowNr);  //insert new row
model->setData(model->index(rowNr, 1), qtemp );  //in Column 1 - your string qtemp
model->submitAll();  //to hand over
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...