crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Вызов функций в отдельном потоке
KuvshinoF
  опции профиля:
сообщение 11.2.2021, 16:42
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 25.7.2013
Пользователь №: 3887

Спасибо сказали: 0 раз(а)




Репутация:   0  


По сети в программу приходят некие данные. Они приходят в функцию MainClass::getData(QVector<int> vec1, QStringList list1) и сохраняются в ней. По кнопке_1 класса-индикатора данных MyClass (объект создан в MainClass) в отдельном потоке (из-за большого объема данных, чтобы не подвисал основной gui) должны индицироваться (в таблицу) данные, сосчитанные из vec1, а по кнопке_2 - данные из list1. Подскажите пож-та как это сделать? (что именно вызывать в методе run() отдельного потока и т.д.?)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.2.2021, 13:54
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


KuvshinoF, тут не нужен дополнительный поток, используй таблицу с моделью
QTableView
QAbstractItemModel
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
KuvshinoF
  опции профиля:
сообщение 12.2.2021, 16:42
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 25.7.2013
Пользователь №: 3887

Спасибо сказали: 0 раз(а)




Репутация:   0  


Алексей1153: а можно поподробнее хотя бы немного как это в моем случае выглядело бы?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.2.2021, 7:39
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


KuvshinoF, там по ссылкам есть описание, как это всё работает. Разбирайся )
https://doc.qt.io/qt-5/qabstractitemmodel.html#details
Model/View Programming

общий принцип : таблица (view) отрисовывает только те ячейки, которые сейчас видны на экране (а их обычно немного, поэтому это происходит быстро, сколько бы данных в массиве ни было).

Данные поставляются классом модели. Наследуешься от QAbstractItemModel и выполняешь там манипуляции по доставке нужных в данный момент из массива данных в таблицу



Сообщение отредактировал Алексей1153 - 13.2.2021, 7:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
KuvshinoF
  опции профиля:
сообщение 15.2.2021, 17:56
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 25.7.2013
Пользователь №: 3887

Спасибо сказали: 0 раз(а)




Репутация:   0  


Создал отдельный класс class MyTableModel: public QAbstractTableModel, переопределил в нем ф-ии rowCount и ColumnCount. Подскажите пож-та как правильно переопределить метод data и главное в какой метод и как передавать данные, например типа QVector<int> vecData для их последующего вывода в QTableView ?

далее делаю
QTableView *poMyTableView = new QTableView;
MyTableModel *poMyTableModel = new MyTableModel;
poMyTableView ->setModel(poMyTableModel);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.2.2021, 20:38
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


KuvshinoF, всё по той же ссылке ) Пример https://doc.qt.io/qt-5/model-view-programmi...eaders-and-data

Цитата(KuvshinoF @ 15.2.2021, 19:56) *
в какой метод и как передавать данные, например типа QVector<int>


в модель нужно передать любым способом ссылку, указатель или даже копию контейнера (но для больших объёмов вряд ли приемлемо передавать копию). В виртуальном методе data для каждой клетки нужно будет возвращать конкретное значение из этого контейнера

Сообщение отредактировал Алексей1153 - 15.2.2021, 20:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
KuvshinoF
  опции профиля:
сообщение 16.2.2021, 13:24
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 25.7.2013
Пользователь №: 3887

Спасибо сказали: 0 раз(а)




Репутация:   0  


Сделал так
MyTableModel:
private:
QVector<int> vecData; // Хранилище табличных данных
/////////////////

int MyTableModel::rowCount(const QModelIndex &parent) const
{
    return vecData.size();
}

int MyTableModel::columnCount(const QModelIndex &parent) const
{
    return 1;
}

void MyTableModel::setData(QVector<int> data)
{
   vecData.clear();
   vecData = data;

   qDebug() << "size= " << vecData.size(); // [b]размер верный, ненулевой [/b]
}

QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (role == Qt::DisplayRole)
        return vecData.at(index.row());
    else
        return QVariant();
}
///////////////
QVector<int> vecMyData; // вектор данных для отображения в таблице
// заполнение vecMyData
poMyTableModel->setData(vecMyData);

Но ничего не выводится... Подскажите в чем ошибка?

Сообщение отредактировал KuvshinoF - 16.2.2021, 13:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.2.2021, 8:38
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


KuvshinoF, попробуй так

void MyTableModel::setData(QVector<int> data)
{
   beginResetModel();
   vecData = data;
   endResetModel();
}


если не получится, прикрепи проект (всё лишнее вырежи, оставь только то, что нужно для демонстрации)

и лучше, конечно, в модели держать ссылку на внешний контейнер. Но это уже следующий шаг - оптимизация. пока разберись с отображением :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
KuvshinoF
  опции профиля:
сообщение 17.2.2021, 21:49
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 25.7.2013
Пользователь №: 3887

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо, Алексей1153, все сделал - работает. Еще вопросик, на будущее, как сделать вывод вышеуказанного вектора данных, например, в 2 столбца (например первые 10 значений в 1-ый столбец таблицы, следующие 10 значений - во второй столбец таблицы)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.2.2021, 8:14
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(KuvshinoF @ 16.2.2021, 15:24) *
MyTableModel::columnCount

тут вернуть 2

Цитата(KuvshinoF @ 16.2.2021, 15:24) *
MyTableModel::data

а тут для каждого index.column() вернуть нужную часть в виде строки, например
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 18:08