Как описано в документации PySide2 , PySide2.QtWidgets.QWidget
не имеет виртуальной функции nativeEvent
, которая доступна и может быть повторно реализована в Qt5 для C ++.Я пытался переопределить это, но это не называется никогда.Вот пример теста:
import sys
from PySide2.QtCore import QObject, QSize
from PySide2.QtWidgets import QApplication, QWidget
class MainWidget(QWidget):
def __init__(self):
super().__init__()
def sizeHint(self):
return QSize(400,300)
def enterEvent(self, event):
print("enterEvent") # this log is printed when mouse enters
return super().enterEvent(event)
def leaveEvent(self, event):
print("leaveEvent") # this log is printed when mouse leaves
return super().leaveEvent(event)
def nativeEvent(self, eventType, message, result):
print("nativeEvent") # never see this log
return super().nativeEvent(eventType, message, result)
if __name__ == "__main__":
app = QApplication()
widget = MainWidget()
widget.show()
sys.exit(app.exec_())
Хотя в C ++ я могу наблюдать множество вызовов nativeEvent
:
### MainWidget.h ###
#pragma once
#include <QWidget>
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = Q_NULLPTR) : QWidget(parent) {}
QSize sizeHint();
protected:
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
};
### MainWidget.cpp ###
#include "MainWidget.h"
QSize MainWidget::sizeHint()
{
return QSize(400, 300);
}
bool MainWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
printf("nativeEvent\n"); // this is printed many times at the beginning of the application
return QWidget::nativeEvent(eventType, message, result);
}
### main.cpp ###
#include <QtWidgets/QApplication>
#include <Windows.h>
#include "MainWidget.h"
int main(int argc, char *argv[])
{
AllocConsole();
freopen("CONOUT$", "w", stdout);
printf("Start..");
QApplication a(argc, argv);
MainWidget w;
w.show();
return a.exec();
}
Есть ли способ переопределить nativeEvent
метод в PySide2?Или обрабатывать сообщения Windows?