В PySide2 как повторно реализовать QWidget :: nativeEvent

Как описано в Документация 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?

Проблема будет решена в PySide2 5.12.0: bugreports.qt.io/browse/PYSIDE-790

eyllanesc 06.12.2018 04:40

Поэтому вам нужно подождать, с другой стороны, ваша реализация nativeEvent неверна, поскольку она получает 2 параметра и возвращает список из 2 элементов: bugreports.qt.io/secure/attachment/76150/pyside790_win.py

eyllanesc 06.12.2018 04:50

@eyllanesc Большое спасибо. Но я немного запутался. Поскольку в документации не указано объявление nativeEvent, как мы можем узнать, сколько параметров получено и сколько значений должно быть возвращено? Что касается меня, я следовал объявлению в документации C++, которое показывает, что метод принимает три параметра и возвращает значение типа bool.

Cosmo 06.12.2018 10:01

@eyllanesc Я пробовал PyQt5. Теперь я понимаю, что это возможно потому, что в Qt C++ третий параметр является указателем результатов. В Python мы можем возвращать несколько значений, поэтому мы можем установить результат по возвращаемым значениям.

Cosmo 06.12.2018 10:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
520
0

Другие вопросы по теме