繁体   English   中英

无效使用非静态成员函数

[英]invalid use of non-static member function

在我的Qt应用程序中,我希望能够在用户按下快捷方式时向非静态QTabWidget添加选项卡。 通常我会这样实现:

File.addAction("Settings", openSettings, Qt::ALT + Qt::Key_S);

其中FileQTabWidgetopenSettings是静态方法。 唯一的问题是它仅适用于静态方法,而那个问题是我无法在静态方法中访问非静态变量。 因此,我发现由于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中捕获this来解决this问题,例如auto openSettings_ = [this]() { this->openSettings(); } auto openSettings_ = [this]() { this->openSettings(); } ;

但另一方面,此功能就像插槽一样。 您应该使用标准的信号/插槽语法将感兴趣的信号直接附加到信号上,而不是编写单独的函子。 那将是这样的。

File.addAction("Settings", this, &(decltype(*this))::openSettings, Qt::ALT + Qt::Key_S);

(请注意,我正在使用decltype因为我不确定*this是什么类型。您可以用类的名称代替。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM