gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:37:24 27 4
gpt4 key购买 nike

我使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com