相关疑难解决方法(0)

C++ Qt:是否可以创建一种模板插槽?

我是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个函数看起来有点奇怪.

有一个更好的方法吗?

c++ qt

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

如何在 C++ lambda 中访问 QObject::sender?

这是一个相当不寻常的问题——但仍然是一个问题。我有一个函数,它接受一个 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调用。

c++ lambda c++11 qt5

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

标签 统计

c++ ×2

c++11 ×1

lambda ×1

qt ×1

qt5 ×1