小编cma*_*t85的帖子

在任何编译之前的qmake预构建步骤

有关如何创建预构建步骤的SO有几个问题qmake,我可以在我的.pro文件中执行此操作:

versionTarget.target = ../VersionData/versioning.h
versionTarget.depends = FORCE
win32: versionTarget.commands = cd $$PWD; python.exe ./version_getter.py -p $$TARGET
else:  versionTarget.commands = cd $$PWD; python ./version_getter.py -p $$TARGET

PRE_TARGETDEPS += ../VersionData/versioning.h
QMAKE_EXTRA_TARGETS += versionTarget
Run Code Online (Sandbox Code Playgroud)

现在,问题是这种方法本身不是构建步骤,而只是另一个构建目标,所以如果我-j为其配置了标志,make则与其他构建作业并行运行我的脚本.这非常糟糕,因为我的脚本创建/更新了一个头文件 - 让它在编译过程中改变是不可接受的.

那么,无论如何我可以在任何编译运行之前执行此脚本吗?我知道我可以创建另一个脚本,并调用version_getter.pyqmake从该序列,但是这是不可取的,因为我将不得不在命令行而不是Qt Creator的范围内进行编译.


更新

.pri每个子项目包含的完整文件如下:

CONFIG += thread
QT += core \
      gui

versionTarget.target = ../VersionData/versioning.h
versionTarget.depends = FORCE
win32: versionTarget.commands = cd $$PWD; python.exe ./version_getter.py -p $$TARGET
else:  versionTarget.commands …
Run Code Online (Sandbox Code Playgroud)

qt qmake

23
推荐指数
2
解决办法
2万
查看次数

Qt/C++:高效绘图

我设计了一个程序,基本上,它将几何形状切割成许多小三角形(在"左侧画布"中),对这组三角形应用一些简单的数学变换,并在新的配置中重绘它们.请参阅下面的屏幕截图

屏幕帽1

为了绘制这些三角形,我使用QPainter::drawPolygon.右边的每个三角形对应左边的三角形,所以我知道我想用什么颜色来绘制它.

到目前为止,很好.即使我画了比这更多的三角形(当我使用更小的三角形来切割形状时),这足够快.

我在程序中添加了一个功能:我可以绘制从图片中提取的三角形而不是普通的三角形:请参阅下面的截屏.

在此输入图像描述

问题是我这样做的方式太慢了.我是这样做的:

  1. 我浏览了所有三角形
  2. 对于每个三角形,我计算将要显示的每个像素的坐标.
  3. 对于这些像素中的每一个,我计算图片上相应像素的坐标(这是一个简单的数学运算),并检索该像素的颜色.
  4. 我使用QPainter::setPen(QColor)QPainter::drawPoint(QPoint)绘制像素.

我是Qt编程的新手,我对图形一无所知,所以这就是我能想到的.问题是它"不可接受"太慢(paintEvent每个画布大约需要0.15s,而普通三角形则为0.01s).

我跑了一个探查器试图了解发生了什么,我注意到在画布小部件中paintEvent,

  1. 58%的时间花在了 QPainter::drawPoint
  2. 27%的时间花在了 QPainter::setPen

它似乎QPainter::drawPoint太复杂和缓慢:我只是想让它打印一个给定颜色的像素,就是这样.

我可能已经找到了解决我的问题的方法:存储一个QImage(作为我的画布小部件的成员变量),它代表我希望我的画布显示的整个事物,并在我的paintEvent像素中完全定义它,然后立即绘制它在我结束paintEventQPainter::drawImage.我有一个提示,这会更快.但在我重新编写代码之前,我想知道这是否真的是我想要做的.

我希望我没有让你做死!非常感谢您的见解.

c++ graphics qt pixel qpainter

18
推荐指数
2
解决办法
6567
查看次数

旧版的.Net没有安装最新的Mono?

我一直在使用Visual Studio Community 2015开发.NET 3.5 C#项目,但我一直打算使用Mono和MonoDevelop在Linux上进行大部分开发(Ubuntu Gnome 15.04).

我正在运行最新的稳定Mono版本(4.0.4)和MonoDevelop(5.9.6),它支持.NET 4.5并且可以毫无问题地打开VS创建的解决方案文件.

现在我已经在Linux上编写了C++应用程序十年来最好的部分,但C#和.NET对我来说是全新的.所以我假设如果我安装了支持.NET 4.5的Mono版本,我也会得到.NET 3.5,因为后者版本是旧版本的超集 - 很像C++ 14编译器支持C++ 03.

然而,事实并非如此,正如MonoDevelop所述(在每个项目的Target Framework选项下):

  • .NET Framework 4.5.1
  • Mono/.NET 4.5
  • Mono/.NET 3.5(未安装)

所以我必须安装一个并行的旧版Mono才能获得.NET 3.5支持,或者我只是遇到配置问题?

.net c# mono monodevelop visual-studio

12
推荐指数
1
解决办法
1万
查看次数

使用着色器时,在QGLWidget中使用QPainter而不是OpenGL

你们中的许多人(特别是4.6)用户将熟悉OpenGL教程中提供的Overpainting示例,我正在尝试做一些非常相似的事情,但是使用着色器来处理纯OpenGL数据,而不是旧的固定功能管道.

//  Set background and state.
makeCurrent();
qglClearColor( bgColour_ );

glEnable( GL_DEPTH_TEST );
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

if ( smoothLines_ ) {
    glEnable( GL_BLEND );
    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
    glEnable( GL_LINE_SMOOTH );
    glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
}

//  Clear the buffers.
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glUseProgram( shader_ );

//  Draw the grid.
try {
    glLineWidth( 2.0f );
    manager_->setColour( centreColour_ );
    grid_->draw( oE_GLGrid::Centre );

    glLineWidth( 1.5f );
    manager_->setColour( majorColour_ );
    grid_->draw( oE_GLGrid::Major );

    glLineWidth( 1.0f );
    manager_->setColour( minorColour_ );
    grid_->draw( …
Run Code Online (Sandbox Code Playgroud)

opengl shader qt overlay qpainter

10
推荐指数
2
解决办法
9060
查看次数

g ++在":"处解析错误

g++ 使用以下代码报告解析错误:

class Sy_timeLineDelegateScene : public QGraphicsScene
{
    Q_OBJECT
public:
    Sy_timeLineDelegateScene( Sy_animPropertyTimeLine* timeline,
                              Sy_animClock* clock,
                              QObject* parent = nullptr );
    virtual ~Sy_timeLineDelegateScene() {}

protected slots:   // Parse error at ":"
    typedef QMap< Sy::Frame, Sy_timeLineDelegateKey* > DelegateTimeLine;
...
Run Code Online (Sandbox Code Playgroud)

我的类派生自QObject并且我Q_OBJECT在错误之前声明了宏,但如果我注释掉该slots部分,它编译得很好.我已经使用Qt了多年而从未见过这个,它一定是愚蠢的东西,但我看不出是什么导致了这个问题.

c++ qt g++ signals-slots

8
推荐指数
1
解决办法
1765
查看次数

QML:Lambda函数意外工作

我认为QML支持lambda函数,因为JavaScript支持匿名函数,而且函数是第一类对象,但它们并不像我期望的那样工作.拿这个代码:

Item {
    property var items: []

    function handler( item ) {
        console.log( item );
    }

    Component.onCompleted: {
        for ( var i = 0; i < 3; ++i ) {
            var item = someObj.createObject();
            item.someValueChanged.connect( function() {
                handler( item ); } );

            items.push( item );
            console.log( "Adding:", item );
        }
    }

    Component {
        id: someObj

        Item {
            property bool someValue: false

            Timer {
                running: true
                onTriggered: {
                    parent.someValue = true;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用lambda,function() { handler( item …

javascript lambda qt qml

8
推荐指数
1
解决办法
1894
查看次数

在特征中乘以变换和矩阵类型

对我而言,这应该是有效的,所以事实并非如此,几乎可以肯定,这意味着我是错误的.尽管原则上变换<double,3,Affine>与Matrix <double,4,4>相同,但它们不能合理地使用:

Affine3d rotMat( AngleAxisd( 45.0, ( Vector3d() << 0.0, 1.0, 0.0 ).finished() ) );
Matrix4d m;
m << 1.0, 0.0, 0.0, 6.0,
     0.0, 1.0, 0.0, 6.0,
     0.0, 0.0, 1.0, 6.0,
     0.0, 0.0, 0.0, 1.0;

m = m * rotMat;
Run Code Online (Sandbox Code Playgroud)

导致最后一行的'不匹配运算符='错误,并且就地乘法运算符导致相同,尝试使用Affine3d初始化Matrix4d也不起作用.有人知道如何以任何有用的方式实际使用Transform类吗?

谢谢,Cam

c++ transform matrix eigen

7
推荐指数
1
解决办法
3747
查看次数

考虑到GPU具有任务队列并且是异步的,计算FPS的正确方法是什么?

我一直认为计算FPS的正确方法是简单地计算绘制循环迭代所花费的时间.互联网的大部分似乎都是一致的.

但!

现代图形卡被视为异步服务器,因此绘制循环发送已经在GPU上的顶点/纹理/等数据的绘图指令.在GPU上的请求完成之前,这些调用不会阻塞调用线程,只是将它们添加到GPU的任务队列中.那么"传统"(而且无处不在)的方法肯定只是衡量呼叫发送时间吗?

让我提出的问题是我实施了传统的方法并且它始终提供了极其荒谬的高帧率,即使渲染的内容导致动画变得不连贯.重新阅读我的OpenGL SuperBible让我进入glGenQueries,它允许我计算渲染管道的各个部分.

总而言之,计算FPS的"传统"方式是否完全与(几乎没有)现代图形卡相关?如果是这样,为什么GPU分析技术相对未知?

opengl profiling gpu

7
推荐指数
1
解决办法
3737
查看次数

SVN to Git migration - undefined author,但确实如此

之前已经提出过类似的问题(就像这个问题一样),但答案并没有为我解决.我的作者文件看起来像这样:

cmannett85 = cmannett85 <cmannett85@###>
cbamber85 = cmannett85 <cmannett85@###>
www-data = cmannett85 <cmannett85@###>
Run Code Online (Sandbox Code Playgroud)

而我得到的错误是;

Author: cmannett85 not defined in users.txt file
Run Code Online (Sandbox Code Playgroud)

此错误发生在大约第1500次提交时,其他作者条目正常,因此条目的基本结构必须正确.我已经在SO上看到的大多数问题围绕着SVN用户名有一个空格预先/附加到它们,但是从粘贴的错误中可以看出 - 没有多余的空白区域.

我也认为可能是因为我为同一个用户名映射了一个用户名,所以我更改了Git用户名,但没有区别.我甚至尝试在Windows和Unix格式之间切换行结束,但再次没有变化.

我使用这个调用操作:

$ git svn clone https://subversion.assembla.com/svn/#### --authors-file=users.txt --no-metadata -s ####
Run Code Online (Sandbox Code Playgroud)

我尝试删除--no-metadataarg,但没有区别.任何人都可以看到我哪里出错了?

UPDATE

按照Lazy Badger的建议,我跑了:

$ svn log --xml | grep author | sort -u | perl -pe 's/.>(.?)<./$1 = /'
Run Code Online (Sandbox Code Playgroud)

它返回:

<author>cbamber85</author>
<author>cmannett85</author>
<author>www-data</author>
Run Code Online (Sandbox Code Playgroud)

svn git git-svn

7
推荐指数
2
解决办法
1597
查看次数

QML条件绑定不按预期工作

如果我有一个简单Binding的形式对象:

Rectangle {
    height: 400
    width: 500

    property var someObj: null

    Binding on color {
        when:  someObj
        value: someObj.color
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我希望的是,当someObjnull,someObjcolor属性绑定到该对象的color属性.我实际得到的是运行时错误消息:

TypeError: Cannot read property 'color' of null
Run Code Online (Sandbox Code Playgroud)

这有什么原因不起作用?

几乎等效的JavaScript表达式:

color: {
    if ( someObj != null ) {
        return someObj.color;
    } else {
        return "black";
    }
}
Run Code Online (Sandbox Code Playgroud)

按预期工作.

qt qml

7
推荐指数
1
解决办法
2175
查看次数