在我的Qt应用程序我希望能够以一个标签,当用户按下一个快捷方式添加到一个非静态QTabWidget
。通常我会实现它是这样的:
File.addAction("Settings", openSettings, Qt::ALT + Qt::Key_S);
其中File
是QTabWidget
和openSettings
是一个静态方法。与唯一的问题是,它仅适用于静态方法,并与该问题是,我不能在静态方法中访问非静态变量。因此我想,因为Qt的请求的功能是静态函数I可以实例化的静态std::function<>
对象作为这样:
static std::function<void(void)> openSettings_ = []() { openSettings; };
并把它作为这样的
File.addAction("Settings", openSettings_, Qt::ALT + Qt::Key_S);
这样做的问题是,它产生的错误:
Error: invalid use of non-static member function 'void window::openSettings()'
我给这家的理由是,我所熟悉的C和假设是什么Qt的调用函子是几乎相同的函数指针几乎是一个对象。因此,我认为如果我实例类型std::function
的静态对象,指着/执行的非静态函数我会解决这个问题,这显然并非如此。我怎么会去这样做,看到我现在的思维过程是错误的?
首先,提出了立即错误,因为你没有实际调用该函数。你必须把它叫做:openSettings();
。
然而,这是不行的。 openSettings
是非静态的成员函数。所有这样的正常成员函数采取一个隐含this
指针到其上他们正在被调用的对象。这意味着人们不能直接调用openSettings
功能,而不在其上调用它的对象。但this
不是由你写的拉姆达捕获,这意味着没有这样的对象。
这可以通过在lambda捕获this
,如auto openSettings_ = [this]() { this->openSettings(); }
被固定;
但在另一方面,这种功能表现得像一个插槽。你应该附上您使用标准的信号/槽语法,而不是写在单独的函子有兴趣直接到信号的信号。这将是这样的。
File.addAction("Settings", this, &(decltype(*this))::openSettings, Qt::ALT + Qt::Key_S);
(请注意,我用decltype
,因为我不知道*this
是什么类型的,你可以用类的名称来替代。)