crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Andrewshkovskii
  опции профиля:
сообщение 6.7.2011, 20:51
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


PyQt - PyQt-Py2.7-x86-gpl-4.8.4-1.exe (SIP там вроде 4.12.1 вроде, но не могу сказать точно)
Собственно сабж , такой экспешен райситься после таких вещей:
виджету подменяется метод contextMenuEvent на следующую функцию:
def create_context_menu(self,menu):
   return lambda event : menu.exec_(event.globalPos())


widget.contextMenuEvent=create_context_menu(cmWrapper([{'action_title':action_handler}]))

Что делает этот код? В он заменяет ивен вызова контекстного меню на кастомное меню, которое создается путем задания конфига (хэш в __init__ у cmWrapper).
Эксепшен прилетает после отработки хэндлера экшена. Код отрабатывается, приложение не крашиться. Просто хотелось бы понять, откуда эксепшен летит и почему.

Для чего это нужно - что бы не писать методы создания менюшек для каждого виджета, а использовать так - как показано.

все это добро прилетает вот отсюда (исходники последнего sip)
/*
 * Report a Python member function with an unexpected return type.
 */
static void sip_api_bad_catcher_result(PyObject *method)
{
    PyObject *mname;

    /*
     * This is part of the public API so we make no assumptions about the
     * method object.
     */
    if (!PyMethod_Check(method) ||
        PyMethod_GET_FUNCTION(method) == NULL ||
        !PyFunction_Check(PyMethod_GET_FUNCTION(method)) ||
        PyMethod_GET_SELF(method) == NULL)
    {
        PyErr_Format(PyExc_TypeError,
                "invalid argument to sipBadCatcherResult()");
        return;
    }

    mname = ((PyFunctionObject *)PyMethod_GET_FUNCTION(method))->func_name;

#if PY_MAJOR_VERSION >= 3
    PyErr_Format(PyExc_TypeError, "invalid result type from %s.%U()",
            Py_TYPE(PyMethod_GET_SELF(method))->tp_name, mname);
#else
    PyErr_Format(PyExc_TypeError, "invalid result type from %s.%s()",
            Py_TYPE(PyMethod_GET_SELF(method))->tp_name,
            PyString_AsString(mname));
#endif
}


мне кажется тут 2 пути решения -
1. Проверить - жива ли функция которая вернулась лямбдой после отработки хэндлера.
2 Собрать свежий SIP и PyQt и попробовать.
Больше у меня мыслей, пока, нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 4.5.2025, 23:01