1

我正在尝试为应用程序计时,以查看加载一些信息并绘制图表需要多长时间。我的函数首先加载数据,然后绘制图表。

计时相当简单,它调用了一个外部函数,该函数从某个日期开始获取毫秒。问题是,即使我在开始时设置 t1 并在我调用 draw 函数后立即设置 t2,t2 也会在 QGraphicsView 实际更新之前返回。(我知道,为什么这应该是异步的,这是有道理的)

例如,当我加载一个大文件时,减去这两个值后它将返回 700 毫秒,但实际渲染要到几秒钟后才能完成。

我浏览了整个网络并搜索了 Qt 文档。我可以找到大量关于自己更新小部件的信息,但没有关于渲染完成后触发的任何类型的信号或事件的信息。

甚至QGraphicsScene::changed信号似乎也仅在下面的场景发生变化时才被触发,而不是在渲染完成并且用户可以看到变化时触发。

有关如何执行此操作的任何帮助?

4

2 回答 2

0

QGraphicsView 或 QWidget 完成绘制或渲染时是否存在信号或事件?

据我所知,它不存在。(寻找类似的东西)

用户可以看到更改

据我所知,Qt使用了双缓冲,所以如果绘画完成了,并不意味着用户可以看到变化。

有关如何执行此操作的任何帮助?

如果您想知道绘画何时完成,那么...

  1. 您可以继承 QGraphicsScene 并实现自己的 drawItems、drawBackground 或 drawForeground。这并不简单(因为项目绘制算法很复杂),但您可以知道每个项目何时完成绘制。
  2. 您可以从paintEventQWidget基于类)或paint()(基于QGraphicsItem/QGraphicsObject类)中触发/发射信号。显然,您需要使用自己的类,并且您必须将 QGraphicsView 或您在视图中绘制的项目或 QGraphicsScene 子类化。
  3. 您还可以创建代理 QPainter 类,这样您就可以知道正在绘制的确切内容和时间。

话虽如此,我怀疑您正在错误地处理您的问题。

  1. 如果您只是想绘制图表,那么您没有理由知道绘制何时完成。
  2. 如果绘制完成,并不意味着用户可以看到结果。
  3. 绘制事件可能会被多次调用。

推荐方法:

使用线程或计时器事件从外部源接收/读取数据(您正在图表中绘制)(显然,如果您使用计时器事件,则需要以小块的形式读取数据),然后从时间更新图表到时间,让 Qt 处理重绘。


这究竟如何让我检测从我选择打开文件到加载所有数据并绘制图表并可见所花费的时间?

  1. 您可以通过子类化您用于绘制 Graph 的任何小部件、覆盖paintEvent 并从paintEvent 中触发信号、调用子例程或执行任何您想要的操作来检测paintEvent 何时完成绘制。
  2. 不保证paintEvent 只会被调用一次。
  3. 要测量单个例程有多慢并定位瓶颈,请使用分析器。VerySleepy、AQTime 等。
  4. 与其测量加载和显示数据需要多长时间,不如单独测量加载时间和显示时间更有意义。这是一个 GUI 应用程序,而不是游戏引擎,因此您无法精确控制何时绘制某些东西。
于 2013-07-03T13:40:00.713 回答
0

我没有测试它,但我认为通过子类QGraphicsScene化和重新实现该render方法,您可以测量渲染时间。

#include <QGraphicsScene>
#include <QTime>

class MyGraphicsScene : public QGraphicsScene 
{
Q_OBJECT
public:
void render ( QPainter * painter, const QRectF & target = QRectF(), const QRectF & source = QRectF(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio ) {
   QTime t;
   t.start();
   QGraphicsScene::render (painter, target, source, aspectRatioMode);
   qDebug("render time %d msec", t.elapsed());
}
};
于 2013-07-03T14:25:22.430 回答