У меня есть QAbstractTableModel со списком отображаемых пользовательских элементов, эта TableModel является моделью TableView. Как я могу обновлять TableView каждые x секунд? Я пробовал beginInsertRows и endInsertRows, но это вызывало лаги, потому что я редактировал слишком много элементов в секунду, поэтому я хочу обновлять его только каждые x секунд.
Qt обновляет TableView каждые x секунд
Ответы (2)
используйте 1_
Например,
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
timer->start(1000);
в processOneThing
можно написать код обновления данных и снова установить таймер с помощью timer->start(1000);
person
s.abbaasi
schedule
03.08.2019
Вот в чем проблема, я не знаю, как обновить данные в табличном представлении.
- person Bennet L.; 04.08.2019
Использование beginInsertRows
и endInsertRows
потенциально может привести к внутренней реорганизации, в которой нет необходимости. Если структура модели (т. е. порядок, количество элементов и т. д.) не меняется, а изменяется только отображаемое содержимое, вам гораздо лучше подавать сигнал dataChanged
.
Этот сигнал сообщает подключенным представлениям об обновлении, и они будут перерисовывать только те элементы, которые видны в области просмотра, они не обрабатывают скрытые элементы.
#include <QtWidgets/QApplication>
#include <QtCore/qtimer.h>
#include <QtWidgets/qtableview.h>
#include <QtCore/QAbstractTableModel>
class TableModel : public QAbstractTableModel {
public:
TableModel(QObject *parent = nullptr) : QAbstractTableModel(parent) {
connect(&timer, &QTimer::timeout, [=]() {
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
});
timer.start(1000);
}
virtual int rowCount(QModelIndex const &index = QModelIndex()) const { return index.parent().isValid() ? 0 : 5; }
virtual int columnCount(QModelIndex const &index = QModelIndex()) const { return index.parent().isValid() ? 0 : 10; }
virtual QVariant data(QModelIndex const &index, int role = Qt::DisplayRole) const {
QVariant value;
if (index.isValid() && role == Qt::DisplayRole) {
value = QString("X %1; Y: %2").arg(qrand()).arg(qrand());
}
return value;
}
private:
QTimer timer;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TableModel model;
QTableView view;
view.setModel(&model);
view.show();
return a.exec();
}
person
RobbieE
schedule
04.08.2019
Это не работает, если я добавляю элементы в TableModel, я ничего не вижу в TableView. Однако вызов layoutAboutToBeChanged(), а затем layoutChanged() каждую секунду работает.
- person Bennet L.; 04.08.2019
Если вы можете заставить мой небольшой пример работать, но включение этого принципа в вашу собственную программу не работает, то я полагаю, что в вашем первоначальном вопросе отсутствует важная информация. Я предлагаю отредактировать ваш вопрос, добавив MCVE, на который мы можем взглянуть для вас.
- person RobbieE; 05.08.2019