簡體   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