Qt每x秒更新一次TableView

时间:2019-08-03 18:27:39

标签: qt tableview refresh qabstracttablemodel

我有一个QAbstractTableModel,它具有显示的自定义项目列表,该TableModel是TableView的模型。如何每隔X秒钟刷新一次TableView?我尝试了beginInsertRows和endInsertRows,但是由于我每秒编辑太多项目,所以这造成了滞后,所以我只想每x秒刷新一次。

2 个答案:

答案 0 :(得分:0)

使用>> uname -r 5.2.3-arch1-1-ARCH >> pacman -Q --info python-flask Name : python-flask Version : 1.0.3-1 Description : Micro webdevelopment framework for Python Architecture : any URL : http://flask.pocoo.org/ Licenses : custom:BSD Groups : None Provides : None Depends On : python-werkzeug python-jinja python-itsdangerous python-click Optional Deps : None Required By : python-flask-wtf Optional For : None Conflicts With : None Replaces : None Installed Size : 789.00 KiB Packager : Felix Yan <felixonmars@archlinux.org> Build Date : Sat 25 May 2019 10:31:00 AM IST Install Date : Sun 04 Aug 2019 01:11:45 AM IST Install Reason : Installed as a dependency for another package Install Script : No Validated By : Signature

例如

QTimer QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));

timer->start(1000);中,您可以编写刷新数据的代码并使用processOneThing

再次设置计时器

答案 1 :(得分:0)

使用beginInsertRowsendInsertRows可能会在内部引起很多不必要的重组。如果模型的结构(即订购,项目数量等)没有改变,仅显示内容,则最好发出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();
}