[英]invalid use of non-static member function
在我的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中捕獲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.