c++ - 如何让QTableView在没有聚焦的情况下自动更新内容?

标签 c++ qt crash

我使用 QTimer 对象扫描计算机内存以检测任何数据更改,最后使用 QTableView 在 GUI 中显示这些数据。
但问题是当程序窗口没有聚焦时,不会检测到任何变化。一旦窗口再次获得焦点,Gui 中的数据就会立即发生变化。

我的问题是如何让tableview自动更新内容?

为了遵循 MVC 风格,我决定使用 QTableView 而不是 QTableWidget。事实上,更新数据很方便,因为我只需要处理一个“模型”,而不是与模型绑定(bind)后的 QTableView

QTableView 对象在 Gui 线程( View 级别)中,而 QStandardItemModel 在另一个线程(控制级别)中使用。对于这个问题,在谷歌搜索后,我尝试了:

QModelIndex t1 = index(i, 3); 
QModelIndex t2 = index(i, 5);
emit dataChanged(t1, t2); 

在执行dataChanged时。它不起作用,当我发现模型端没有问题时,我也尝试了:

connect(&timer, &QTimer::timeout, this, [&]() {
        ui.searchTableV->viewport()->update();
        });
    timer.start();

在 GUI 类构建的最开始。有时它可以工作,但通常会引发“访问冲突”。

就我个人而言,我从来没有想到会出现这样的问题,因为之前 QTableWidget 一切都工作正常。在我发现 this on QT forum 后,我似乎需要对子类 QStyledItemDelegate 做一些事情,以使 QTableView 更加健壮。 。但我不想这样做,我想应该有更简单的方法。

另外,我想知道这个问题是否是一个错误,或者它只是设计成这样的。

最佳答案

我也尝试重现您所描述的行为,但我无法做到这一点。我的应用程序按预期工作,即使它失去焦点也没关系。也没有崩溃。也许你正在做一些不同的事情。

Worker.h

#pragma once
#include <QObject>
#include <QThread>
#include <QStandardItemModel>

class Worker : public QObject {
    Q_OBJECT
public:
    Worker();
    void setModel(QStandardItemModel* model);

public slots:
    void addItems();

private:
    QStandardItemModel* mModel{ nullptr };
};

Worker.cpp

#include "Worker.h"

Worker::Worker()
{

}

void Worker::setModel(QStandardItemModel* model)
{
    mModel = model;
}

void Worker::addItems()
{
    for (;;) {
        mModel->appendRow(new QStandardItem("Item"));
        QThread::currentThread()->msleep(1000);
    }
}

ma​​in.cpp

#include <QApplication>
#include <QFrame>
#include <QHBoxLayout>
#include <QPushButton>
#include <QThread>
#include <QTreeView>
#include <QStandardItemModel>
#include "Worker.h"

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    auto frame = new QFrame;
    frame->setLayout(new QHBoxLayout);
    auto view = new QTreeView;
    auto model = new QStandardItemModel;
    view->setModel(model);
    auto worker = new Worker;
    worker->setModel(model);
    auto thread = new QThread;
    worker->moveToThread(thread);
    thread->start();
    frame->layout()->addWidget(view);
    auto btnStart = new QPushButton("Start add items");
    QObject::connect(btnStart, &QPushButton::clicked, worker, &Worker::addItems);
    frame->layout()->addWidget(btnStart);
    frame->show();
    return a.exec();
}

关于c++ - 如何让QTableView在没有聚焦的情况下自动更新内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57570564/

相关文章:

iphone - 转到上一个 ViewController 时应用程序崩溃

windows - 尝试使用 WinDbg : PEB is Paged Out, 分析转储文件不会加载符号

c++ - static_assert with nonconstexpr objects in hana's tutorial

c++ - priority_queue、迭代器和排序

c++ - 您如何确保调用 Derived 析构函数?

c++ - 处理刚性物体跟踪中的随时间漂移?

macos - 使用 Qt 框架在 MAC 上部署 Qt 应用程序

c++ - 自身模板崩溃原因

c++ - 如何为控制台输入 (stdin) 获取类似 QIODevice 的信号?

javascript - IE6 因这个 jQuery 崩溃