- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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);
}
}
main.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/
我是一名优秀的程序员,十分优秀!