小编pau*_*ulm的帖子

OpenGL谷歌风格2D相机/缩放到鼠标光标

我试图在OpenGL中实现一个像Google地图相机一样的2D相机.特别是"缩放到鼠标点"功能.

到目前为止,我已经能够实现平移和缩放OK - 但仅限于缩放被锁定到窗口/窗口小部件的中心.如果我尝试放大鼠标位置,视图似乎"跳跃",并且在缩放级别增加后,我放大的项目不再位于鼠标光标下.

我的相机课程在下面 - 相当多的代码,但我无法让它变得更小!

我打电话给Apply()每一帧的开始,并SetX/YPos在场景平移时调用,最后我在滚动鼠标滚轮时用鼠标位置调用SetScale前一个刻度+/- 0.1f.


camera.h

class Camera
{
public:
    Camera();

    void Apply();

    void SetXPos(float xpos);
    void SetYPos(float ypos);
    void SetScale(float scaleFactor, float mx, float my);

    float XPos() const { return m_XPos; }
    float YPos() const { return m_YPos; }
    float Scale() const { return m_ScaleFactor; }

    void SetWindowSize(int w, int h);
    void DrawTestItems();

private:
    void init_matrix();

    float m_XPos;
    float m_YPos;

    float m_ScaleFactor;

    float m_Width;
    float m_Height;

    float …
Run Code Online (Sandbox Code Playgroud)

c++ opengl geometry camera zoom

5
推荐指数
1
解决办法
2685
查看次数

Qt信号lambda导致shared_ptr泄漏?

我有以下代码:

#include <QApplication>
#include <memory>
#include <QUndoCommand>
#include <QWidget>

class Document
{
public:
    Document()
    {
        qDebug("Document");
    }

    ~Document()
    {
        qDebug("~Document");
    }

    QUndoStack mUndostack;
};

class DocumentRepository
{
public:
    DocumentRepository()
    {
        qDebug("DocumentRepository");
    }

    ~DocumentRepository()
    {
        qDebug("~DocumentRepository");
    }


    void AddDoc(std::shared_ptr<Document> doc)
    {
        mDocs.emplace_back(doc);
    }

    std::vector<std::shared_ptr<Document>> mDocs;
};

class Gui : public QWidget
{
public:
    Gui(DocumentRepository& repo)
     : mRepo(repo)
    {
        qDebug("+Gui");

        for(int i=0; i<3; i++)
        {
            CreateDoc();
        }

        mRepo.mDocs.clear();

        qDebug("-Gui");
    }

    ~Gui()
    {
        qDebug("~Gui");
    }

    void CreateDoc()
    {
        auto docPtr = std::make_shared<Document>();
        connect(&docPtr->mUndostack, …
Run Code Online (Sandbox Code Playgroud)

c++ lambda qt shared-ptr qt-signals

5
推荐指数
1
解决办法
608
查看次数

是否有任何编译器选项可以使x64版本崩溃转储更有用?

每当我获得我的应用程序的x64版本构建的崩溃转储时,我发现它很少见,我可以查看本地人,这使得很难或无法解决一些问题.在x86中,我通常可以查看所有本地人没有任何问题.

发布版本中是否有任何编译器选项允许我在发布版本崩溃转储中查看本地?显然我不想关闭优化但也许有一些方法可以强制它来保存本地人,但性能影响很小?

debugging windbg visual-c++ visual-studio-2013

5
推荐指数
1
解决办法
240
查看次数

如何在boost 1.55中使用boost :: split和boost :: string_ref

代码:

#include <iostream>
#include <boost/algorithm/string.hpp>
#include <boost/utility/string_ref.hpp>

int main() 
{
    boost::string_ref str = "test_the_world";
    std::vector<boost::string_ref> strs;
    boost::split(strs, str, boost::is_any_of("_"), boost::token_compress_on);
    for (auto& v : strs)
    {
        std::cout << v << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:

1>C:\boost_1_55_0\boost/range/iterator_range_core.hpp(643): error C2665: 'boost::basic_string_ref<char,std::char_traits<char>>::basic_string_ref' : none of the 4 overloads could convert all the argument types
1>          C:\boost_1_55_0\boost/utility/string_ref.hpp(79): could be 'boost::basic_string_ref<char,std::char_traits<char>>::basic_string_ref(const charT *,boost::basic_string_ref<charT,std::char_traits<char>>::size_type)'
1>          with
1>          [
1>              charT=char
1>          ]
1>          while trying to match the argument list '(const char *, const char …
Run Code Online (Sandbox Code Playgroud)

boost c++11

5
推荐指数
2
解决办法
1616
查看次数

如何停止 make -jN 消耗过多内存?

我有一个构建,如果我使用make -j2它,大约 20 分钟即可完成。

如果我使用的make -j3话,15分钟内就可以完成。然而,有时make -j3编译器会因为使用过多的系统内存而崩溃。有没有办法告诉编译器在内存不足时限制其实例以防止这种情况发生?

c++ linux gcc makefile

5
推荐指数
1
解决办法
378
查看次数

COM - #include生成的头文件vs #import生成的tlb

我有很多生成COM DLL的项目,这些项目输出如下:

projectname_i.h
projectname_i.c
projectname_p.c
projectname_i.tlb
Run Code Online (Sandbox Code Playgroud)

然后在另一个项目使用此DLL的地方使用它,如下所示:

#import "projectname.tlb" named_guids no_namespace
Run Code Online (Sandbox Code Playgroud)

我想将此更改为使用include而不是import.

想从改变背后的原因#import#include是因为我想使/MP编译器开关,加快构建时间.

http://msdn.microsoft.com/en-us/library/bb385193.aspx

所以我想知道的是:

  • 为什么COM DLL有TLB和H?
  • 应该使用哪个以及为什么?
  • 使用#include vs #import有什么区别?切换到#include会有任何不可预见的后果吗?

com idl visual-studio-2010 visual-c++

4
推荐指数
1
解决办法
6176
查看次数

QGraphicsView双击事件和ScrollHandDrag模式项目问题

我正在尝试使用以下行为创建QGraphicsView:

  • 当按住控制键并且鼠标左键停止时,视图应设置为ScrollHandDrag模式以允许用户平移.

  • 在ScrollHandDrag模式下,项目不应该是可选择/可移动的,如下面的问题所示:在QGraphicsView的ScrollHandDrag模式中,如何停止场景中QGraphicsItems的移动?

  • 如果按住控制键,则单击鼠标左键,然后释放控制键,然后视图应保持ScrollHandDrag模式直到释放鼠标,或者如果控制键在此时停止,则将保持此模式鼠标被释放.

对我来说,这听起来应该是相当简单的.我已经从链接的问题中实现了逻辑,并为我的额外需求提供了一些额外的逻辑.然而,这似乎导致以下两个showstoppers:

  • 在mousePressEvent中,将鼠标下的项设置为不具有可移动和可选择的标志,调用基类,然后重新应用标志会使项目变为"冻结".解决这个问题的唯一方法似乎是控件+点击,释放控制+释放在项目外单击几次.此外,当它进入此状态时,不能移动任何项目(尽管仍然可以选择它们).

  • 双击视图会导致mousePressEvent,然后是两个mouseReleaseEvents!这打破了我的逻辑.

所以我想知道如何在QGraphicsView的In ScrollHandDrag模式中解决物品被冻结的问题,如何停止QGraphicsItems在场景中的移动?使用,以及如何处理奇怪的双击鼠标事件 - 是否有办法将其关闭?

这是我的代码(这也是我的hello world Python,所以如果我犯了一些可怕的Python错误,请告诉我):

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyMainWindow(QMainWindow):
    def __init__(self):
        super(MyMainWindow, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("Test")
        self.gv = MyGraphicsView()
        self.setCentralWidget(self.gv)
        self.setGeometry(170, 130, 450, 250)

class MyGraphicsView(QGraphicsView):
    def __init__(self):
        super(MyGraphicsView, self).__init__()
        self.setup()

    def setup(self):
        self.m_MouseIsDown = False
        self.m_ControlKeyDown = False
        self.setDragMode(QGraphicsView.RubberBandDrag)

    def mouseMoveEvent(self,  event):
       # print "mouseMoveEvent: " + str(event.pos().x()) …
Run Code Online (Sandbox Code Playgroud)

qt qt4 pyqt pyqt4 python-2.7

4
推荐指数
1
解决办法
4395
查看次数

HexRays - “__OFSUB__()”的目的是什么?

在以下使用 Ida pro 的 Hex 射线的反编译函数中:

int sub_409650()
{
  int v0; // ecx@1
  int result; // eax@1
  bool v2; // zf@1
  bool v3; // sf@1
  unsigned __int8 v4; // of@1
  unsigned __int16 v5; // cx@2
  unsigned int v6; // ecx@2

  v0 = gS1_dword_62EEA8 & 7;
  result = gS1_dword_62EEA8 - v0;
  v4 = __OFSUB__(gS1_dword_62EEA8 - v0, 16);
  v2 = gS1_dword_62EEA8 - v0 == 16;
  v3 = gS1_dword_62EEA8 - v0 - 16 < 0;
  gS1_dword_62EEA8 -= v0;
  gs2_dword_62EFB4 >>= v0;
  if ( …
Run Code Online (Sandbox Code Playgroud)

c reverse-engineering ida decompiler

4
推荐指数
1
解决办法
3690
查看次数

如何避免使用大向量初始化的“编译器限制:编译器堆栈溢出”?

在单元测试中,我收到以下编译器错误:

 The error message indicates as follows: 
 'fatal error C1063: compiler limit: compiler stack overflow'
Run Code Online (Sandbox Code Playgroud)

这是由某些包含以下内容的标头引起的:

std::vector<unsigned char> GetTestData()
{
     return { 0x1, 0x2, 0x3 }; // Very large 500kb of data
}
Run Code Online (Sandbox Code Playgroud)

如何以这种方式使用向量而不会使MSVC崩溃?请注意,该代码在clang和gcc中构建成功。

c++ visual-c++

4
推荐指数
1
解决办法
1210
查看次数

在调用FindFirstFile时"<"的含义是什么?

如果我创建一个包含"Hello.txt"的目录,那么以下代码将输出"Hello.txt":

#include <windows.h>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    WIN32_FIND_DATA findData = {};
    HANDLE hFind = ::FindFirstFile(L"<.txt", &findData);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        std::wcout << findData.cFileName << std::endl;
        while (::FindNextFile(hFind, &findData))
        {
            std::wcout << findData.cFileName << std::endl;
        }
        ::CloseHandle(hFind);
    }
    else
    {
        std::wcout << "FindFirstFile: " << ::GetLastError() << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但为什么"<"在调用中表现得像"*" FindFirstFile

MSDN表示只有外卡承租人在此次通话中有效(即?或*).

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364418%28v=vs.85%29.aspx

编辑:

似乎是非常相关的FindFirstFile无证通配符或bug?

c++ windows winapi

3
推荐指数
1
解决办法
213
查看次数