我有一个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++中,我有一个带有可调用函数的类,我想要做的是从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++中定义参数并调用回调以实现此目的?
谢谢!
在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_Debug和lua_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结构的用途,还是我应该使用的其他工具或方法?
如果我有一个像这样的结构:
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)
有一个更好的方法吗?
请考虑以下代码:
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)
难道我做错了什么?
如果我有一个符号表:
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中调用仿函数的方式有关,但我不知道.
我究竟做错了什么?
我有一个后台函数,目前有类似的东西:
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可能会出现并锁定互斥锁.
有没有人有更好的方法来做这个的建议?
谢谢.
如何在规则开始时检测到错误?例如,考虑文档中包含的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)
我得到的非常通用,不太有用:
解析失败了.
如何修改规则以信息方式报告错误?
我试图在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':已初始化
我究竟做错了什么?谢谢!
我有一个应用程序,我想在用户问一个问题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)
无论如何,我可以得到用户在纸张上按下哪个按钮而不必实现我自己的按钮QDialog?msgBox我连接的信号是什么?
考虑以下:
#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) 我很惊讶今天在同事的代码中看到了一些语法.
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++ ×11
qt ×4
boost ×3
boost-spirit ×2
c++11 ×2
boost-test ×1
concurrency ×1
constructor ×1
debugging ×1
javascript ×1
lua ×1
macos ×1
mutex ×1
overloading ×1
qmessagebox ×1
qml ×1
qtquick2 ×1
struct ×1
templates ×1
tuples ×1
xcode ×1