小编sve*_*aro的帖子

如何在从QObject派生的类上正确使用qRegisterMetaType?

我一直在寻找答案,但无济于事.我的哀叹如下:

我有一个ClassA大致如下:

class ClassA : public QObject {
    Q_OBJECT
public:
    ClassA() { mName = "lol"; }
    ~ClassA();
    void ShowName() { std::cout << mName << std::endl; }
    std::string mName;
};
Run Code Online (Sandbox Code Playgroud)

当然,因为我使用moc,这个类实际上在我的项目中被分成cpp和hpp,但这部分不是问题.

请注意,我不会Q_DECLARE_METATYPE故意使用,因为我现在实际上并不需要它的功能(QVariant扩展).我只关心运行时实例化.

这里的问题是Q_OBJECT禁止复制和赋值构造函数.因此,我不得不适用qRegisterMetaTypeClassA自己,但ClassA*乍一看似乎工作得很好.

现在,我想在运行时从字符串动态创建此类并运行该方法ShowName().我是这样做的:

int main() {
    qRegisterMetaType<ClassA*>("ClassA*");

    int id = QMetaType::type("ClassA*");
    std::cout << "meta id: " << id << std::endl; // Outputs correct generated user id (not 0)

    ClassA* myclass = static_cast<ClassA*>(QMetaType::construct(id));
    myclass->ShowName(); // Segfaults, oh …
Run Code Online (Sandbox Code Playgroud)

c++ reflection qt

24
推荐指数
3
解决办法
3万
查看次数

C++标准:多集中的意外的const_iterator

我最近碰到了一个奇怪的问题,我在迭代多重集时得到了一个const_iterator而不是预期iterator的.事实证明这对于MSVC来说不是问题,但g ++给了我一个错误:

错误:从'const boost :: shared_ptr'类型的表达式初始化'myPtr&'类型的引用无效

相关代码:

typedef std::multiset<myPtr> myList;
myList _mystuff;
void tick(float dt)
{
    for (myList::iterator i = _mystuff.begin(); i != _mystuff.end(); ++i)
    {
        myPtr &mine = *i; // g++ problem here, not for MSVC
        // const myPtr &mine = *i; works fine for g++
        mine->tick(dt);
    }
}
Run Code Online (Sandbox Code Playgroud)

相当多的研究表明这是一个很多先前讨论的问题.我找到了这些相关的部分:

我对这个问题的背景知识和掌握是有限的,因此我想知道标准是否不能很好地定义这种行为,在这种情况下,g ++和MSVC可以根据自己的喜好实现行为,或者g ++或MSVC是否偏离了明确的标准.

提前致谢.

c++ standards g++ visual-c++

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

在公共容器中存储从公共接口派生的类的对象最安全的方法是什么?

我想管理从公共容器中的共享接口类派生的一堆类对象.

为了说明这个问题,我们假设我正在构建一个包含不同演员的游戏.让我们来调用接口IActor,并获得EnemyCivilian如此.

现在,我的想法是让我的游戏主循环能够做到这一点:

// somewhere during init
std::vector<IActor> ActorList;
Enemy EvilGuy; 
Civilian CoolGuy;
ActorList.push_back(EvilGuy);
ActorList.push_back(CoolGuy);
Run Code Online (Sandbox Code Playgroud)

// main loop
while(!done) {
    BOOST_FOREACH(IActor CurrentActor, ActorList) {
        CurrentActor.Update();
        CurrentActor.Draw();
    }
}
Run Code Online (Sandbox Code Playgroud)

... 或类似的规定.这个例子显然不起作用,但这就是我在这里问的原因.

我想知道:在一个通用的异构容器中管理这些对象的最佳,最安全,最高级的方法是什么?我知道各种方法(Boost :: Any,void*,带有boost :: shared_ptr的处理程序类,Boost.Pointer容器,dynamic_cast)但我无法确定哪种方法可以去这里.

另外我想强调一点,我希望尽可能远离手动内存管理或嵌套指针.

非常感谢:).

c++ containers interface heterogeneous

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

如何在QML中访问ListView的ListModel的ListElement的映射委托数据?

基本上,我有一个通常的ListView:

Rectangle {
    id: mylist

    ListModel {
        id: mylistModel
        ListElement {
            text: "blah1"
        }
        ListElement {
            text: "blah2"
        }
        ListElement {
            text: "blah3"
        }
    }

    Component {
        id: mylistDelegate

        Text {
            id: mylistDelegateText
            text: text
            property bool mylistDelegateTextEnabled: false
        }
    }

    ListView {
        id: mylistView
        model: mylistModel
        delegate: mylistDelegate
    }
}
Run Code Online (Sandbox Code Playgroud)

请忽略我可能通过截断代码以关注重要内容而引入的任何问题.

无论如何,现在我的问题是我想访问ListElement的已分配委托,并查看mylistDelegateTextEnabled在javascript循环中的值.例如,这个循环迭代当前列表并给出模型中ListElements的文本:

for(var i = 0; i < mylistModel.count; ++i) {
    console.log(mylistModel.get(i).text);
}
Run Code Online (Sandbox Code Playgroud)

这显然很好.

现在我想要的基本上是这样的:

for(var i = 0; i < mylistModel.count; ++i) {
    console.log(mylistModel.get(i).text);
    console.log(mylistModel.get(i).delegate.mylistDelegateTextEnabled);
}
Run Code Online (Sandbox Code Playgroud)

唉,它似乎并不那么容易.

帮助赞赏.

javascript qt qml

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

如何使用QtMultimedia播放wav文件?

我目前的代码是:

void Sound::run() {
    QFile audio_file(mResourcePath);
    if(audio_file.open(QIODevice::ReadOnly)) {
        audio_file.seek(44); // skip wav header
        QByteArray audio_data = audio_file.readAll();
        audio_file.close();

        QBuffer* audio_buffer = new QBuffer(&audio_data);
        qDebug() << audio_buffer->size();

        QAudioFormat format;

        format.setSampleSize(16);
        format.setSampleRate(44100);
        format.setChannelCount(2);
        format.setCodec("audio/pcm");
        format.setByteOrder(QAudioFormat::LittleEndian);
        format.setSampleType(QAudioFormat::UnSignedInt);

        QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
        if (!info.isFormatSupported(format)) {
            qWarning()<<"raw audio format not supported by backend, cannot play audio.";
            return;
        }
        qDebug() << info.deviceName();

        QAudioOutput* output = new QAudioOutput(info, format);
        output->start(audio_buffer);
    }
}
Run Code Online (Sandbox Code Playgroud)

整个过程在QThreadPool中作为QRunnable启动,该部分工作正常.问题是我从来没有得到任何音频.我的声音设备正常运行,缓冲区已满.我不知道出了什么问题.我使用app.exec().帮助赞赏.

c++ audio qt

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

如何通过重复字符串生成所有变体?

我想用C++中的字符串重复生成所有变体,我非常喜欢非递归算法.我过去曾提出过递归算法,但由于复杂性(r ^ n),我希望看到一种迭代方法.

我很惊讶我无法在网络上或StackOverflow上的任何地方找到解决此问题的方法.

我想出了一个Python脚本,它可以做我想要的:

import itertools

variations = itertools.product('ab', repeat=4)
for variations in variations:
        variation_string = ""
        for letter in variations:
                variation_string += letter
        print variation_string
Run Code Online (Sandbox Code Playgroud)

输出:

aaaa aaab aaba aabb abaa abab abba abbb baa baab baba babb bba bbab bbba bbbb

理想情况下,我想要一个可以产生精确输出的C++程序,采用完全相同的参数.

这是出于学习目的,它不是功课.我希望我的作业就是这样.

c++ algorithm permutation combinatorics

6
推荐指数
1
解决办法
6089
查看次数

如何在C++中序列化树结构?

我正在尝试序列化/反序列化游戏场景,以便网络发送/接收和从/向磁盘保存/加载.

我的游戏引擎使用节点和组件,因此这些是唯一需要序列化的对象.场景可能如下所示:

Root Node
  - Node
    - SpecializedComponent
    - SpecializedComponent
    - Node 
      - Node
  - Node
    - Node
    - Node
      - Node
        - Node
          - SpecializedComponent
  - Node
Run Code Online (Sandbox Code Playgroud)

Node基本上是这样的:

class Node {
    map<String, Node> mChildren;
    map<String, Component> mComponents;
    uuid_t mId;
    Node* mParent;
};
Run Code Online (Sandbox Code Playgroud)

SpecializedComponent基本上是这样的:

class SpecializedComponent : public Component {
    uuid_t mId;
    Node* mNode;
};
Run Code Online (Sandbox Code Playgroud)

我想使用YAML或JSON作为我的文本表示.我有Qt,Boost和我想要的任何其他库,因此依赖性不是问题.实际上,节点已经是Q_OBJECTS所以我有反射.

尽管有反思,但将其正确地反序列化回C++树结构似乎是一个问题.

最理想的是,我想要一个优雅而有效的解决方案,将这样的结构序列化/反序列化为二进制或文本格式.

c++ tree serialization

6
推荐指数
1
解决办法
4130
查看次数

如何提高SQLAlchemy的性能?

我创建了一个客户端应用程序,它使用HTTP通过简单的API与Python 2服务器通信.服务器非常广泛地使用SQLAlchemy的ORM来为这些HTTP请求提供数据.问题是即使只有很少的活动客户端,我的CPU使用率也很高.该服务器应该能够同时为每个客户端提供大约1个请求,同时为几百个客户端提供服务,因此它仍然应该是可管理的(或者我希望如此).

如何提高性能?我知道问题是ORM,因为cProfile非常清楚地表明了这一点.单个查询显然执行大约10000个Python指令,这看起来很奇怪.我尝试插入不同的数据库引擎/后端,并将解释器更改为Pypy只是为了好玩,但它显然没有帮助原始问题,也没有提高性能.

我在这做错了什么?我真的希望这是一个"好吧,呃!" 问题.

我的关系应该是不同的类型吗?渴望,懒惰,动态等?现在,我没有特别说明.

非常感谢.

python sql sqlalchemy

6
推荐指数
1
解决办法
1707
查看次数

如何在 actix-web 1.0 中间件中读取请求的正文?

我想在 actix-web 1.0 的中间件中读出正文。我正在使用闭包式中间件,使用wrap_fn.

我的基本设置是这样的:

let mut server = HttpServer::new(move || {
    ActixApp::new()
        .wrap_fn(|req, srv| {
            srv.call(req).map(|res| {
                let req_ = res.request();
                let body = req_.magical_body_read_function();
                dbg!(body);
                res
            })
        })
});
Run Code Online (Sandbox Code Playgroud)

我需要那个magical_body_read_function()可悲的是不存在的东西。

我通过阅读示例和使用将一些看起来可以工作的东西拼凑在一起take_payload(),但遗憾的是它没有工作:

let mut server = HttpServer::new(move || {
    ActixApp::new()
        .wrap_fn(|req, srv| {
            srv.call(req).map(|res| {
                let req_ = res.request();
                req_.take_payload()
                    .fold(BytesMut::new(), move |mut body, chunk| {
                        body.extend_from_slice(&chunk);
                        Ok::<_, PayloadError>(body)
                    })
                    .and_then(|bytes| {
                        info!("request body: {:?}", bytes);
                    });
                res
            })
        })
});
Run Code Online (Sandbox Code Playgroud)

给我

error[E0599]: …
Run Code Online (Sandbox Code Playgroud)

middleware rust actix-web

6
推荐指数
2
解决办法
3319
查看次数

如何在X11中全局捕获每次鼠标点击?

我想在X11中捕获每个鼠标单击事件并将它们传递给我的C++应用程序.我不仅希望捕获在主窗口顶部进行的点击,而且每次都不考虑我的主窗口.看起来我可以使用XGrabPointer轻松完成此任务.但是,我希望一切都表现得好像我从未抓住过这个事件.也就是说,我希望事件能够继续他们在层次结构中的其他客户的正常旅程,我只想成为第一个窥探事件的人.我不希望这些事件被"吃掉".

谷歌搜索问题似乎有一些解决方案,但显然所有这些解决方案都已被破坏或弃用.最有希望的是Xrecord + Xtest,但这似乎也被弃用了.

看起来现在应该使用Xinput2来完成,但是如何使用它的信息真的很少.我很欣赏一些见解.

编辑:我仍然喜欢这个答案!

c++ linux x11 mouse input

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