小编Chr*_*phe的帖子

将信号/槽(QObject)添加到QGraphicsItem:性能命中?

我想在QGraphicsItem中添加信号/槽,这样我就可以从另一个线程到达QGraphicsItemObjects.我知道有两个选项:使用QGraphicsObject或从QObject和QGraphicsItem继承.

使用QGraphicsObject

这被认为是缓慢的.根据stackoverflow 上的这个答案,QGraphicsObjects由于它们的实现而很慢.当我查看QGraphicsObjects的源代码时,我可以看到根据对象所做的更改发出了很多信号.对我来说,这似乎是QGraphicsObjects缓慢的原因,但我认为第二种解决方案可以避免这种性能上升(如果真的是一次).

继承自QObject和QGraphicsItem.

当构造一个继承自QObject和QGraphicsItem的类时,你似乎得到了QGraphicsObject最有趣的功能减去性能命中:你可以在你的类中定义槽和发出信号,但是你不能继承QGraphicsObject的默认实现.你会不断发出你可能不感兴趣的变化的信号.你现在能够发出信号,但不必担心你不关心的事情会发出信号(x值变化会在QGraphicsObject中发出信号但是不在这个解决方案中).

我的问题摘要

  • QGraphicsObjects真的比QGraphicsItems慢吗?
  • 如果它们是,是因为实现发出信号(并且发射信号是一个很大的性能损失)?
  • 如果是这样,第二个解决方案(多重继承)是否会避免这种惩罚?

c++ qt qt4

14
推荐指数
2
解决办法
7486
查看次数

如何在QGraphicsItem :: paint()中将QGLFrameBufferObject绘制到painter上

我的问题的小版本

在QGraphicsItem :: paint()函数中,我有一个QGLFrameBufferObject.如何在作为参数传递的画家的paintdevice上获得它?(假设QGraphicsItem位于由QGraphicsView呈现的场景中,该场景具有QGLWidget作为视口=> painter正在使用opengl引擎)

QGraphicsItem::paint(QPainter* painter, ...)
{
    QGLFramebufferObject fbo;
    QPainter p(fbo);
    ... // Some painting code on the fbo
    p.end();

    // What now? How to get the fbo content drawn on the painter?
}
Run Code Online (Sandbox Code Playgroud)

我查看了Qt提供的framebufferobject和pbuffer示例.在那里使用自定义opengl代码在QGLWidget中绘制fbo/pbuffer.是否可以在QGraphicsItem的paint()方法中执行相同的操作并将场景/视图中的QGraphisItem的位置考虑在内?

我的问题的大版本

情况草图

我有一个QGraphicsScene.它是一个具有QGraphicsEffect的项目(通过覆盖QGraphicsEffect的draw()来实现自己的实现).场景由QGraphicsView呈现,其中QGLWidget作为视口.

在QGraphicsEffect :: draw(QPainter*)中,我必须生成一些pixmap,然后我想使用提供的画家绘制(画家将QGLWidget作为paintdevice).构建像素图是一些绘制调用的组合,我希望这些在硬件中完成.

简化示例:(我不会在我的draw()方法中调用sourcepixmap,因为不需要演示我的问题)

class OwnGraphicsEffect: public QGraphicsEffect
{
     virtual void draw(QPainter* painter);
}

void OwnGraphicsEffect::draw(QPainter* painter)
{
    QRect rect(0,0,100,100);
    QGLPixelBuffer pbuffer(rect.size(), QGLFormat(QGL::Rgba));
    QPainter p(pbuffer);
    p.fillRect(rect, Qt::transparent);
    p.end();

    painter->drawImage(QPoint(0,0), pbuffer->toImage(),rect);
}
Run Code Online (Sandbox Code Playgroud)

实际问题

我关心的是我的代码的最后一行:pbuffer-> toImage().我不想用这个.由于性能原因,我不想进行QImage转换.有没有办法从我的glpixelbuffer获取pixmap,然后使用painter-> drawpixmap()?

我知道我也可以使用以下方法将pbuffer复制到纹理:

GLuint dynamicTexture = pbuffer.generateDynamicTexture(); …
Run Code Online (Sandbox Code Playgroud)

opengl qt

13
推荐指数
2
解决办法
4814
查看次数

如何在每个函数的入口处添加代码?

我想在每个函数调用之前添加一些代码来进行一些检查.我知道的唯一方法是:

#define SOME_CODE printf("doing something...");

class testObject
{
void function1()
{
 SOME_CODE
 ...
}
void function2()
{
 SOME_CODE
 ...
}
}
Run Code Online (Sandbox Code Playgroud)

有没有更清洁的方法来实现这一目标?我正在寻找一种方法,所以我没有手动为每个函数添加"SOME_CODE".

c++

12
推荐指数
4
解决办法
4758
查看次数

如何将现有的Mercurial存储库转换为使用子存储库并保持历史记录不变?

我一直在阅读有关子存储库以及如何使用转换扩展和文件映射将现有文件夹从Mercurial存储库提取到子存储库的信息.我能成功地做到这一点.如果我有以下文件夹结构:

C:\Project
---Project\root.txt
---Project\SubFolder
---Project\SubFolder\fileinsubfolder.txt
Run Code Online (Sandbox Code Playgroud)

我可以创建SubFolder的子存储库.以同样的方式,我可以提取一切独立的存储库(在这个例子中,第二个存储库只有root.txt文件).之后,我可以将SubFolder存储库作为子存储库添加到第二个存储库.但是,尽管两个存储库都具有完整的历史记录,但这些历史记录并未链接=>将根存储库更新为较早的状态不会将子存储库置于该点应该处于的状态.更新到一致的旧版本(自动更新root和subrepo)只有在更新到已知道子库且具有.hgsubstate文件的修订版时才有效.

我想到的另一种选择就是忘记当前存储库中SubFolder中的文件,并在SubFolder中启动一个新的存储库,同时添加一个.hgsub文件.我希望在这里实现的是从这一点开始使用子存储库,但仍然有办法更新到旧版本(在分离子库之前),因为SubFolder的文件仍然在当前存储库的历史记录中.

这不起作用:当我忘记了mercurial中的文件时,在新的仓库中将其作为当前仓库中的subrepo链接并且在子流程存在之前更新为旧版本我得到此错误:

C:\Project>hg update 1
abort: path 'SubFolder\fileinsubfolder.txt' is inside repo 'SubFolder'
Run Code Online (Sandbox Code Playgroud)

这里的问题是,当更新到不知道subrepo的旧版本时,此更新想要将文件放在SubFolder中.但是这个SubFolder仍然是另一个repo(有一个.hg目录),虽然主repo没有关于它的回忆,但是更新不希望将文件放在SubFolder中,因为它是一个repo.

无论如何都可以解决这个错误,或者是否有更好的方法来切换到现有Mercurial存储库中某个文件夹的subrepo使用并保持历史记录完整(并且两个历史记录都已链接)?

mercurial subrepos

10
推荐指数
1
解决办法
1670
查看次数

标签 统计

c++ ×2

qt ×2

mercurial ×1

opengl ×1

qt4 ×1

subrepos ×1