По сети в программу приходят некие данные. Они приходят в функцию MainClass::getData(QVector<int> vec1, QStringList list1) и сохраняются в ней. По кнопке_1 класса-индикатора данных MyClass (объект создан в MainClass) в отдельном потоке (из-за большого объема данных, чтобы не подвисал основной gui) должны индицироваться (в таблицу) данные, сосчитанные из vec1, а по кнопке_2 - данные из list1. Подскажите пож-та как это сделать? (что именно вызывать в методе run() отдельного потока и т.д.?)
KuvshinoF, тут не нужен дополнительный поток, используй таблицу с моделью
https://doc.qt.io/qt-5/qtableview.html
https://doc.qt.io/qt-5/qabstractitemmodel.html
Алексей1153: а можно поподробнее хотя бы немного как это в моем случае выглядело бы?
KuvshinoF, там по ссылкам есть описание, как это всё работает. Разбирайся )
https://doc.qt.io/qt-5/qabstractitemmodel.html#details
https://doc.qt.io/qt-5/model-view-programming.html
общий принцип : таблица (view) отрисовывает только те ячейки, которые сейчас видны на экране (а их обычно немного, поэтому это происходит быстро, сколько бы данных в массиве ни было).
Данные поставляются классом модели. Наследуешься от QAbstractItemModel и выполняешь там манипуляции по доставке нужных в данный момент из массива данных в таблицу
Создал отдельный класс class MyTableModel: public QAbstractTableModel, переопределил в нем ф-ии rowCount и ColumnCount. Подскажите пож-та как правильно переопределить метод data и главное в какой метод и как передавать данные, например типа QVector<int> vecData для их последующего вывода в QTableView ?
далее делаю
QTableView *poMyTableView = new QTableView;
MyTableModel *poMyTableModel = new MyTableModel;
poMyTableView ->setModel(poMyTableModel);
KuvshinoF, всё по той же ссылке ) Пример https://doc.qt.io/qt-5/model-view-programming.html#model-headers-and-data
Сделал так
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, попробуй так
void MyTableModel::setData(QVector<int> data)
{
beginResetModel();
vecData = data;
endResetModel();
}
Спасибо, Алексей1153, все сделал - работает. Еще вопросик, на будущее, как сделать вывод вышеуказанного вектора данных, например, в 2 столбца (например первые 10 значений в 1-ый столбец таблицы, следующие 10 значений - во второй столбец таблицы)?
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)