小编Gri*_*ief的帖子

QVector :: append()显式复制的原因是什么?

template <typename T>
void QVector<T>::append(const T &t)
{
    const T copy(t);
    const bool isTooSmall = uint(d->size + 1) > d->alloc;
    if (!isDetached() || isTooSmall) {
        QArrayData::AllocationOptions opt(isTooSmall ? QArrayData::Grow :     QArrayData::Default);
        reallocData(d->size, isTooSmall ? d->size + 1 : d->alloc, opt);
    }
    if (QTypeInfo<T>::isComplex)
        new (d->end()) T(copy);
    else
        *d->end() = copy;
    ++d->size;
}
Run Code Online (Sandbox Code Playgroud)

是什么原因const T copy(t)而不是t通过值传递给方法?这和之间有什么区别:

template <typename T>
void QVector<T>::append(const T t)
{
    const bool isTooSmall = uint(d->size + 1) > d->alloc;
    if (!isDetached() || isTooSmall) …
Run Code Online (Sandbox Code Playgroud)

c++ qt

9
推荐指数
1
解决办法
763
查看次数

QVector对默认构造函数的要求是什么原因?

我可以看到这些类被视为调用默认构造函数所需的复杂对象:

void QVector<T>::defaultConstruct(T *from, T *to)
{
    if (QTypeInfo<T>::isComplex) {
        while (from != to) {
            new (from++) T();
        }
    ...
}
Run Code Online (Sandbox Code Playgroud)

但目前尚不清楚为什么需要在QVector的"隐藏"区域构建对象.我的意思是这些对象根本不可访问,那么为什么不保留内存而不是真正的对象创建呢?

作为奖励的问题,我想问一下,如果我想有非默认constractible对象的数组,可我安全地更换QVector<T>QVector<Wrapper<T>?在哪里Wrapper是这样的:

class Wrapper {
public:
    union {
        T object;
        bool hack;
    };
    Wrapper() {}
    Wrapper(const T &t) : object { t }  {}
    Wrapper(const Wrapper &t) : object { t.object } {}

    Wrapper &operator=(const Wrapper &value) {
        object = value.object;
        return *this;
    }

    ~Wrapper() {}
};
Run Code Online (Sandbox Code Playgroud)

c++ qt containers qvector

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

asyncio + multiprocessing + unix

我有一个宠物项目,具有以下逻辑:

import asyncio, multiprocessing

async def sub_main():
    print('Hello from subprocess')

def sub_loop():
    asyncio.get_event_loop().run_until_complete(sub_main())

def start():
    multiprocessing.Process(target=sub_loop).start()

start()
Run Code Online (Sandbox Code Playgroud)

如果你运行它,你会看到:

Hello from subprocess
Run Code Online (Sandbox Code Playgroud)

那很好.但我要做的就是制作start()协程:

async def start():
    multiprocessing.Process(target=sub_loop).start()
Run Code Online (Sandbox Code Playgroud)

要运行它,我必须做这样的事情:

asyncio.get_event_loop().run_until_complete(start())
Run Code Online (Sandbox Code Playgroud)

这是问题:当创建子进程时,它会克隆整个Python环境,因此事件循环已经在那里运行:

Process Process-1:
Traceback (most recent call last):
  File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
    self.run()
  File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "test.py", line 7, in sub_loop
    asyncio.get_event_loop().run_until_complete(sub_main())
  File "/usr/lib/python3.5/asyncio/base_events.py", line 361, in run_until_complete
    self.run_forever()
  File "/usr/lib/python3.5/asyncio/base_events.py", line 326, in run_forever
    raise RuntimeError('Event loop is running.')
RuntimeError: Event …
Run Code Online (Sandbox Code Playgroud)

python unix python-asyncio python-multiprocessing python-3.5

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

类方法和函数的装饰器

我有一个装饰师

def deco(func):
    def inner(params):
        #< DO STUFF WITH func >
    return inner
Run Code Online (Sandbox Code Playgroud)

和一个基类

class GenericClass:
    def __init__(self,value):
        self.value = value
    def method(self,params):
        print 'NOT IMPLEMENTED YET'
    def other_method(self):
        print 'GOOD TO GO'
Run Code Online (Sandbox Code Playgroud)

我希望能够在 GenericClass 的子类上装饰“method”方法,例如检查输入/输出或处理异常(方法“method”将被覆盖)

我想做的是...

class ChildClass(GenericClass):
    @deco
    def method(self,params):
        #< NEW METHOD >
Run Code Online (Sandbox Code Playgroud)

我不是专家Python开发人员,该级别的所有文档都非常混乱(即元类、装饰器的微妙之处、__call__方法等),而且我没有找到解决方案。

python decorator

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

无法为模块 %modulename% 加载 QML 插件:无法从 %module.so% 中提取插件元数据

我想编写 QML 插件来将一些类从 Qt 公开到 QML 层。我从这里跟随指南。这是代码:

暴露.pro

TEMPLATE = lib
CONFIG += qt plugin
QT += qml gui

DISTFILES += expose.json
DESTDIR = ../g/Expose
TARGET = expose
SOURCES += expose.cpp
Run Code Online (Sandbox Code Playgroud)

暴露.cpp

#include <QQmlExtensionPlugin>
#include <QQmlEngine>

#include <QGuiApplication>

class QGuiApplicationWrapper : public QGuiApplication {
    int argc;
public:
    QGuiApplicationWrapper() : QGuiApplication(argc, nullptr) {}
};

class QExampleQmlPlugin : public QQmlExtensionPlugin {
    Q_OBJECT
    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
    void registerTypes(const char *uri) {
        Q_ASSERT(uri == QLatin1String("g.Expose"));
        qmlRegisterType<QGuiApplicationWrapper>(uri, 1, 0, "GuiApplication");
    }
};
Run Code Online (Sandbox Code Playgroud)

但是当我尝试 …

qml qt5

5
推荐指数
0
解决办法
3789
查看次数

zsh compadd - 如何指定参数的描述?

随着_arguments我可以做_arguments {-h,--help}'[Show help]',但如何指定'Show help'的信息compadd参数?在文档中找不到

zsh zsh-completion

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

首选cmake项目结构

我想要以下结构A -> B -> C,其中:

  • C 是样板代码、第三方库的包装器、非常基本的代码等。
  • B 是特定于项目域的公共类、函数和数据结构。
  • A 是项目本身。

我想让它易于重用CB(+C)将来在我的其他项目中使用。此外,我还有以下要求:

  1. 由于所有三个项目都在建,我想有建设的能力CC+BC+B+A一个炮打响。
  2. 我宁愿在动态静态链接,这样CC+B将静态库,并且C+B+A将可执行
  3. 我想让 cmake 列表和配置文件保持简单和干净。我在官方维基和互联网上找到的例子非常庞大和可怕。
  4. 如果我更改A,BC文件系统中的位置,它不需要更改多于几行,那就太好了。
  5. 所有这三个组件都在使用 google-test,但我不确定它对项目布局是否重要。

我对 cmake 很陌生,我什至不明白写文件XXXConfig.cmakeFindXXX.cmake文件更好。另外,我不确定,我应该如何使用X_INCLUDE_DIRS.

c++ cmake

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

GLFW - 所有窗口的一个上下文

我想将 OpenGL 图形绘制到多个窗口中。所有窗户都“通向”同一个“世界”,据我所知,有两种选择:

  1. 在窗口之间共享上下文。对于 GLFW 来说,这是一项非常简单的任务,我在这方面取得了一些进展,但是,代码变得越来越模糊,而且我知道 OpenGL 不是多线程的,因此从多线程渲染到多个上下文中没有任何好处。

  2. 我看到一个建议,有一个单一的上下文,并使用它来一个一个地渲染所有窗口,即渲染第一个窗口,交换缓冲区,渲染第二个窗口,交换缓冲区,再次渲染第一个窗口,依此类推。

但是,我无法确定是否可以使用 GLFW 的选项二。在图书馆的概念中,窗口和上下文看起来紧密相连。

opengl glfw

2
推荐指数
1
解决办法
2093
查看次数

CSS 与纯 JS 的过渡无延迟

我想要实现的是从 js 两次更改某些属性(background-color在上面的代码中),以便在它们之间运行转换,但不会从前一个状态到第一个状态。上面的代码几乎从不工作,因为超时设置为零,当它至少设置为 10 时,它几乎总是工作,当我将其设置为 100 时,它总是在我的机器上工作。我还想要的是完全避免超时和以太线性运行代码或基于适当的事件回调运行代码(到目前为止我没有发现任何有用的)。

这是一个示例(也在 jsFiddle 上):

var outter = document.getElementById('outter');
var test = document.getElementById('test');

test.onclick = function() {
  outter.removeChild(test);
    test.style.backgroundColor = 'green'
  outter.appendChild(test);
  setTimeout(function() {
    test.style.backgroundColor = 'red'
  }, 0);
}
Run Code Online (Sandbox Code Playgroud)
#test {
  position: fixed;
  left: 2em;
  right: 2em;
  top: 2em;
  bottom: 2em;
  background-color:red;

  transition-duration: 2s
}
Run Code Online (Sandbox Code Playgroud)
<div id=outter>
  <div id=test></div>
</div>
Run Code Online (Sandbox Code Playgroud)

javascript css css-transforms

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