為什么nativeEvent函式永遠不會被呼叫?
// .h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
bool nativeEvent(const QByteArray& eventType, void* message, long*);
//private slots:
// virtual bool nativeEvent(const QByteArray & eventType, void * message, long * result) override;
private:
Ui::MainWindowClass ui;
//protected:
// bool nativeEvent(const QByteArray& eventType, void* message, long* result);
};
//.cpp
bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, long* result)
{
//...
}
我發現了一些類似的問題,人們建議將其定義為override但是當我嘗試時:
bool nativeEvent(const QByteArray& eventType, void* message, long*) override;
它沒有編譯錯誤:member function declared with 'override' does not override a base class member.
注釋行是我嘗試定義它的其他方式,但我在上面遇到了同樣的錯誤。
uj5u.com熱心網友回復:
QWidget::nativeEvent()的簽名是:
bool QWidget::nativeEvent(
const QByteArray &eventType, void *message, qintptr *result)
因此,qintptr是一個
用于以有符號整數表示指標的整數型別(用于散列等)。
qint32或 qint64的型別定義。此型別保證與Qt 支持的所有平臺上的指標大小相同。在具有 32 位指標的系統上,qintptr 是 qint32 的 typedef;在具有 64 位指標的系統上,qintptr 是 qint64 的 typedef。
(強調我的。)
根據報錯,
member function declared with 'override' does not override a base class member
在 OPs 平臺上sizeof (long) != sizeof (qintptr)。
例如在我的平臺上(帶有目標的 Visual Studio 2019 x64)
sizeof (long): 4sizeof (qintptr): 8。
如果虛擬成員函式的簽名與被覆寫的虛擬基類成員函式的簽名不匹配,則后者不會被覆寫。為了使編譯器可以檢測到這種情況,override引入了識別符號以明確意圖。
因此,沒有override它是行不通的。(我本來希望編譯器發出警告,但這可能取決于編譯器設定。)但是,override在這種情況下,編譯器被迫發出錯誤。
修復很明顯:OP 應該使用qintptr*而不是long*最后一個引數result。
如果在 OP 的特定情況下預計它實際上是 a long,則可以在函式體中顯式轉換它。
請注意,這sizeof (long)也取決于平臺:基本型別,通常在 32 位和 64 位之間變化。因此,它在 Visual Studio 中始終x86為 32 位(with 和 with x64),但在 Linux 中為 g 和 target 的 64 位x64。(我忘了 g 在 Linux 上發出 32 位代碼時是怎樣的……)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/514831.html
標籤:C qt
上一篇:啟用圖層后qml組件消失
