非法使用非静态成员函数

问题描述 投票:0回答:1

在我的Qt应用程序我希望能够以一个标签,当用户按下一个快捷方式添加到一个非静态QTabWidget。通常我会实现它是这样的:

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

其中FileQTabWidgetopenSettings是一个静态方法。与唯一的问题是,它仅适用于静态方法,并与该问题是,我不能在静态方法中访问非静态变量。因此我想,因为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的静态对象,指着/执行的非静态函数我会解决这个问题,这显然并非如此。我怎么会去这样做,看到我现在的思维过程是错误的?

c++ qt qt5
1个回答
2
投票

首先,提出了立即错误,因为你没有实际调用该函数。你必须把它叫做: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是什么类型的,你可以用类的名称来替代。)

© www.soinside.com 2019 - 2024. All rights reserved.