Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Просмотр спокойного источника, кажется этим, когда слот называют от QMetaObject:: invokeMethod тип возврата может быть определен и возвращаемое значение, получен. (Взгляните на invokeMethod в спокойной справке)
я не мог найти много примеров этого на самом деле используемого в спокойном источнике. Один я нашел, был
bool QAbstractItemDelegate::helpEvent
, который является слотом с типом возврата и назван от
QAbstractItemView::viewportEvent
использование invokeMethod.
я думаю, что возвращаемое значение для слота только доступно, когда функция вызвана непосредственно (когда это - нормальная функция C++), или при использовании invokeMethod. Я думаю, что это действительно предназначено для внутренних спокойных функций, а не для нормальной эксплуатации в программах с помощью QT
Редактирование: Для демонстрационного случая:
case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])), *reinterpret_cast< int(*)>(_a[2])));
if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break;
вектор _a является списком аргументов, который передается qt_metacall. Это передается QMetaObject:: invokeMethod. Таким образом, возвращаемое значение в MOC генерировало код, сохраняется и пасуется назад вызывающей стороне. Таким образом для взаимодействий слота нормального сигнала возвращаемое значение не используется ни для чего вообще. Однако механизм существует так, чтобы к возвращаемым значениям от слотов можно было получить доступ, если слот называют через invokeMethod.
Возвращаемое значение только полезно, если Вы хотите назвать слот как нормальную функцию членства: class MyClass : public QObject {
Q_OBJECT
public:
MyClass(QObject* parent);
void Something();
public Q_SLOTS:
int Other();
};
пустой MyClass:: Что-то () {интервал res = это-> Другой ();...} Редактирование: кажется, что это не единственный способ, которым возвращаемое значение может использоваться, QMetaObject:: метод invokeMethod может использоваться, чтобы назвать слот и получить возвращаемое значение. Хотя кажется, что это немного более сложно, чтобы сделать.
Это очень полезно, когда вы имеете дело с динамическим языком таким QTScript JavaScript Qtpython и так далее. С помощью этого языка / привязки вы можете использовать динамически с помощью C ++, используя интерфейс, предоставленный MetaObject. Как вы, наверное, знаете, только сигналы и слоты проанализируются MOC и генерируют описание MetaObject. Поэтому, если вы используете C ++ Qobject из привязки JavaScript, вы сможете вызвать только такие слоты, и вы захотите возвращаемое значение. Часто QT-привязки для динамических языков предоставляют некоторое средство для аксессуаров к нормальному методу, но процесс определенно более трики.