Qt обновляет TableView каждые x секунд

У меня есть QAbstractTableModel со списком отображаемых пользовательских элементов, эта TableModel является моделью TableView. Как я могу обновлять TableView каждые x секунд? Я пробовал beginInsertRows и endInsertRows, но это вызывало лаги, потому что я редактировал слишком много элементов в секунду, поэтому я хочу обновлять его только каждые x секунд.


person Bennet L.    schedule 03.08.2019    source источник


Ответы (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
comment
Вот в чем проблема, я не знаю, как обновить данные в табличном представлении. - 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
comment
Это не работает, если я добавляю элементы в TableModel, я ничего не вижу в TableView. Однако вызов layoutAboutToBeChanged(), а затем layoutChanged() каждую секунду работает. - person Bennet L.; 04.08.2019
comment
Если вы можете заставить мой небольшой пример работать, но включение этого принципа в вашу собственную программу не работает, то я полагаю, что в вашем первоначальном вопросе отсутствует важная информация. Я предлагаю отредактировать ваш вопрос, добавив MCVE, на который мы можем взглянуть для вас. - person RobbieE; 05.08.2019