在我的Qt应用程序中,我希望能够在用户按下快捷方式时向非静态QTabWidget
添加选项卡。通常我会这样实现:
File.addAction("Settings", openSettings, Qt::ALT + Qt::Key_S);
其中
File
是QTabWidget
,openSettings
是静态方法。唯一的问题是它仅适用于静态方法,而那个问题是我无法在静态方法中访问非静态变量。因此,我认为由于Qt要求该函数为静态函数,因此可以实例化静态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捕获,这意味着不存在此类对象。
可以通过在lambda中捕获this
来解决此问题,例如auto openSettings_ = [this]() { this->openSettings(); }
;
但另一方面,此功能就像插槽一样。您应该使用标准的信号/插槽语法将感兴趣的信号直接附加到信号上,而不是编写单独的函子。那将是这样的。
File.addAction("Settings", this, &(decltype(*this))::openSettings, Qt::ALT + Qt::Key_S);
(请注意,我正在使用
decltype
,因为我不确定*this
是什么类型。您可以用类的名称代替。)关于c++ - 无效使用非静态成员函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54546054/