我是Qt的新手而不是C++专家所以请耐心等待.我正在开发一个具有12种不同QPushButtons的应用程序,但它们都执行非常类似的操作:它们从地图中获取一些值,然后使用它来设置该按钮的样式:
void MainWindow::on_btn01_clicked(){
QString img=images["btn01"];
ui->btn01->setStyleSheet("#btn01{ background-image: url(://" + img + ") }");
}
Run Code Online (Sandbox Code Playgroud)
对于12个按钮中的每一个,我必须创建一个仅在使用的按钮上有所不同的插槽.因此,创建几乎完全相同的12个函数看起来有点奇怪.
有一个更好的方法吗?
这是一个相当不寻常的问题——但仍然是一个问题。我有一个函数,它接受一个 lambda 作为参数,然后将它传递给QObject::connect:
template<typename Functor>
void MyClass::doSomething(Functor f)
{
connect(network_reply, &QNetworkReply::finished, f);
//...
}
Run Code Online (Sandbox Code Playgroud)
的示例调用MyClass::doSomething可能如下所示:
doSomething([]()
{
// how do I get access to the sender???
});
Run Code Online (Sandbox Code Playgroud)
正如您从我的评论中可以看出的那样,无法QObject::sender获得指向QObject发出信号的指针的访问权限。因为发出信号的类不在创建 lambda 的范围内,所以无法在 lambda 内部引用它。
我有哪些选择?
编辑:我尝试使用安迪的建议 ( std::bind) 但我最终得到了那些几乎无法理解的模板错误之一:
http://paste.ubuntu.com/1614425/
摘抄:
decltype 无法解析重载函数的地址
...它指向QObject::connect调用。