小编Add*_*ddy的帖子

Qt Slots和C++ 11 lambda

我有一个QAction项目,我初始化如下:

QAction* action = foo->addAction(tr("Some Action"));
connect(action, SIGNAL(triggered()), this, SLOT(onSomeAction()));
Run Code Online (Sandbox Code Playgroud)

然后onSomeAction看起来像:

void MyClass::onSomeAction()
{
    QAction* caller = qobject_cast<QAction*>(sender());
    Q_ASSERT(caller != nullptr);

    // do some stuff with caller
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,我得到了caller对象,我可以按预期使用它.然后我尝试使用C++ 11方式连接对象,如下所示:

connect(action, &QAction::triggered, [this]()
{
    QAction* caller = qobject_cast<QAction*>(sender());
    Q_ASSERT(caller != nullptr);

    // do some stuff with caller
});
Run Code Online (Sandbox Code Playgroud)

但是caller始终为null,因此Q_ASSERT触发器.我怎样才能使用lambdas来获取发件人?

c++ qt c++11

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

将Javascript回调传递给Qml中的C++ Invoked方法

在C++中,我有一个带有可调用函数的类,我想要做的是从QML/Javascript调用该方法(我已经开始工作)并传递一个Javascript回调.

在代码中,我将我的类定义为:

class MyObject: public QObject
{

Q_OBJECT

public:
    Q_INVOKABLE void doSomething(quint64 x, /* what goes here? */ jsCallback)
    {
        x += 1;

        // I suspect this will require a invocation mechanism but 
        // this shows what I'd like to do
        jsCallback(x);
    }
};
Run Code Online (Sandbox Code Playgroud)

在我的QML中,我想做的事情如下:

Rectangle {

    function myCallback(x){
        console.log("x=" + x);
    }

    MouseArea{
        anchors.fill: parent
        onClicked:{
            myObject.doSomething(2, myCallback);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以当我点击时Rectangle,我会x=3在控制台中看到.如何在C++中定义参数并调用回调以实现此目的?

谢谢!

javascript qt qml qtquick2

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

Lua和C++ API获取执行信息

在Lua中我有一个调用的函数utils.debug(),我想要做的是在我的Lua代码中使用它,如下所示:

function Foo:doSomething
    if (/* something */) then
        print("Success!")
    else
        utils.debug()
    end
end

function Foo:doSomethingElse
    if (/* something else */) then
        print("Awesome!")
    else
        utils.debug()
    end
end
Run Code Online (Sandbox Code Playgroud)

我想在整个Lua代码中使用它来帮助我调试.因此,我希望我的C++代码知道utils.debug()调用Lua代码的位置.我看着lua_Debuglua_getinfo他们似乎非常接近我想要的东西,但我缺了一块:

int MyLua::debug(lua_State* L)
{
    lua_Debug ar;
    lua_getstack(L, 1, &ar);
    lua_getinfo(L, ??????, &ar);

    // print out relevant info from 'ar' 
    // such as in what function it was called, line number, etc
}
Run Code Online (Sandbox Code Playgroud)

这是lua_Debug结构的用途,还是我应该使用的其他工具或方法?

c++ debugging lua

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

来自元组的构造函数参数

如果我有一个像这样的结构:

struct Thing
{
  int x;
  int y;
  bool a;
  bool b;
}
Run Code Online (Sandbox Code Playgroud)

然后我可以通过以下方式创建一个Thing对象:Thing t {1,2,true,false};.但是,如果我有一个元组,那么我正在做类似的事情:

std::tuple<int, int, bool, bool> info = std::make_tuple(1,2,true,false);
Thing t { std::get<0>(info), std::get<1>(info).. // and so on
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

c++ constructor struct tuples

6
推荐指数
3
解决办法
1837
查看次数

Boost的数据驱动测试'join operator` +`破坏了第一列

请考虑以下代码:

BOOST_DATA_TEST_CASE(
      sampleTest,
      (data::make(1) ^ data::make(2)) + (data::make(3) ^ data::make(4)),
      var1,
      var2)
{
  std::cout << var1 << "," << var2 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我期望的输出是:

1,2
3,4
Run Code Online (Sandbox Code Playgroud)

但是,var1似乎是腐败的:

$> ./MyTests --run_test=Tests/sampleTest
Running 2 test cases...
202875304,2
202875304,4

*** No errors detected
$> ./MyTests --run_test=Tests/sampleTest
Running 2 test cases...
83976616,2
83976616,4

*** No errors detected
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

c++ boost boost-test

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

搜索/迭代boost :: spirit :: qi ::符号

如果我有一个符号表:

struct MySymbols : symbols<char, MyEnum::Fruits>
{
    MySymbols ()
        : symbols<char, MyEnum::Fruits>(std::string("MySymbols"))
    {
        add("apple", MyEnum::Apple)
           ("orange", MyEnum::Orange);
    }
};
Run Code Online (Sandbox Code Playgroud)

我想迭代表格,以便按数据值搜索符号.我不能使用lambda表达式,所以我实现了一个简单的类:

template<typename T>
struct SymbolSearcher
{
    SymbolSearcher::SymbolSearcher(T searchFor)
        : _sought(searchFor)
    {
        // do nothing
    }

    void operator() (std::basic_string<char> s, T ct)
    {
        if (_sought == ct)
        {
            _found = s;
        }
    }

    std::string found() const { return _found; }

private:
    T _sought;
    std::string _found;
};
Run Code Online (Sandbox Code Playgroud)

我正在使用它如下:

SymbolSearcher<MyEnum::Fruits> search(ct);
MySymbols symbols;

symbols.for_each(search);
std::string symbolStr = search.found();
Run Code Online (Sandbox Code Playgroud)

如果我设置断点,_found = s我可以确认_found正在设置,但是search.found()总是返回一个空字符串.我猜它与for_each中调用仿函数的方式有关,但我不知道.

我究竟做错了什么?

c++ boost boost-spirit boost-spirit-qi

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

使用QMutex :: tryLock和QMutexLocker

我有一个后台函数,目前有类似的东西:

void SomeClass::someFunction()
{
    if (!_mutex.tryLock())
    {
        // i want to know the mutex is locked, and then exit the function
        return;
    }
    else
    {
        _mutex.unlock();
    }

    QMutexLocker locker(_mutext);

    // do some stuff that **could** throw an exception
}
Run Code Online (Sandbox Code Playgroud)

我的困境涉及到这个_mutex.unlock()QMutextLocker声明.

如果_mutex被锁定,那么我想知道它.如果不是,那么我想锁定它.问题是我想用来QMutexLocker锁定_mutex大部分功能.该函数可能会抛出异常,因此手动解锁_mutex可能很困难并且容易出错.

上面的解决方案有效,但我担心的是,在其他东西_mutex.unlock()的减速之间的某个时刻QMutexLocker可能会出现并锁定互斥锁.

有没有人有更好的方法来做这个的建议?

谢谢.

c++ concurrency qt mutex

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

Boost.Spirit.Qi - 规则开头的错误

如何在规则开始时检测到错误?例如,考虑文档中包含的Mini XML示例.如果我为解析器提供类似的东西:

<element>this is an error<element>
Run Code Online (Sandbox Code Playgroud)

然后我得到:

错误!期待这里:""

错误!期待这里:""

解析失败了.

那很好,但后来考虑喂它:

element>this is an error</element>
Run Code Online (Sandbox Code Playgroud)

我得到的非常通用,不太有用:

解析失败了.

如何修改规则以信息方式报告错误?

c++ boost boost-spirit boost-spirit-qi

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

C++ 11在Visual Studio 2012中的委派构造函数

我试图在Visual Studio 2012中使用委托构造函数.以下代码在Xcode 4.6中编译,但在Visual Studio 2012中不编译:

在.h文件中

class ErrorReportDlg : public QDialog
{

public:
    ErrorReportDlg(OwlExceptionPtr ex, QWidget *parent);
    ErrorReportDlg(QWidget *parent);

    virtual ~ErrorReportDlg();
}
Run Code Online (Sandbox Code Playgroud)

在.cpp文件中

// FWIW, OwlExceptionPtr is 
// typdef boost::shared_ptr<OwlException> OwlExceptionPtr

ErrorReportDlg::ErrorReportDlg(OwlExceptionPtr ex, QWidget *parent)
    : QDialog(parent),
    _error(ex)
{
    // stuff
}

ErrorReportDlg::ErrorReportDlg(QWidget *parent)
    : ErrorReportDlg(OwlExceptionPtr(), parent) // <--- error here
{
    // do nothing
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

错误C2437:'ErrorReportDlg':已初始化

我究竟做错了什么?谢谢!

c++ xcode c++11 visual-studio-2012

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

Mac上的Qt :: Sheet和QMessageBox :: show()

我有一个应用程序,我想在用户问一个问题QMessageBox,然后做出相应的回应.问题是在Mac上我希望对话框显示为Sheet,但使用该open()方法立即返回.

QMessageBox* msgBox = new QMessageBox(
    QMessageBox::Question,
    "Delete Record?",
    "Are you sure you want to delete this record?"
    QMessageBox::Yes | QMessageBox::No,
    this,
    Qt::Sheet);

int ret = msgBox->exec(); // does not show up as a sheet on Mac
msgBox->open(); // shows up as a sheet but returns immediately
Run Code Online (Sandbox Code Playgroud)

无论如何,我可以得到用户在纸张上按下哪个按钮而不必实现我自己的按钮QDialogmsgBox我连接的信号是什么?

c++ macos qt qmessagebox

3
推荐指数
2
解决办法
1782
查看次数

C++ 歧义重载

考虑以下:

#include <string>

template <typename T, 
    typename std::enable_if<(
        std::is_integral<T>::value 
        && !std::is_same<T, bool>::value
    )>::type = 0>
void add(T val)
{
}

void add(bool val)
{
}

void add(const char* val)
{
}

int main()
{
    add(true);
    add("hi");
    add(0);
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨这add(0);是模棱两可的:

[x86-64 clang 6.0.0 #1] 错误:对“add”的调用不明确

我认为这是因为0可以隐式转换为boolor const char*。但是,我希望编译器选择模板化方法,而不必强制转换0(即add((int)0);)或指定模板化类型(即add<int>(0);)。

我还尝试将模板签名更改为:

template <typename T, 
    typename std::enable_if<(
        std::is_integral<T>::value 
        && !std::is_same<T, bool>::value
        && !std::is_same<T, unsigned char>::value
    )>::type = 0>
void add(T val) …
Run Code Online (Sandbox Code Playgroud)

c++ templates overloading

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

赋值运算符的返回值可以作为参考吗?

我很惊讶今天在同事的代码中看到了一些语法.

void doSomething(bool& boolRef);

bool ok = true;
doSomething(ok = false);
Run Code Online (Sandbox Code Playgroud)

我认为这是一个错误,因为param中的赋值运算符ok = false,返回赋值的值,在本例中为false.由于doSomething期待参考,我的第一反应是"那应该不起作用",因为它看起来几乎完全相同doSomething(false);

但唉它确实有效.并且doSomething像你期望的那样重新分配工作中的引用值.

有人可以解释为什么这有效吗?

谢谢!

c++

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