Ошибка сегментации при использовании QObject - PullRequest
0 голосов
/ 04 марта 2020

Значения вроде не равны нулю, canconvert имеет значение true и является действительным. Но все равно ошибка сегментации возникает при попытке приведения Я отлаживаю, и набор значений мог быть удален непосредственно перед вызовом setValue с новым значением.

QVariant m_model = 0;

является членом var

void Handler::setValue(const QVariant &var)
{
    bool isNull = m_model.isNull();
    bool canConvert = m_model.canConvert<QObject*>();
    bool isValid = m_model.isValid();

    if(!m_model.isNull() && m_model.canConvert<QObject*>()) {
        bool sConverts = (nullptr != m_model.value<QObject*>());
    }

    m_model = var;
}

Может кто-нибудь сказать, почему происходит сбой при все же в m_model есть некоторые данные.

1 Ответ

0 голосов
/ 05 марта 2020

Сначала возникли некоторые проблемы с вашим кодом:

QVariant::canConvert() возвращает, может ли тип значения быть конвертируемым вообще, если не может быть преобразовано фактически содержащееся в нем значение. Пример: вы создаете QVariant с QString в качестве значения. Вызов myValue.canConvert<double>() вернет true , даже если ваша строка была "ерундой". Это связано с тем, что QVariant обычно способен преобразовывать строки типа «1.0» в двойное значение 1,0.

QVariant::isValid() возвращает значение, не содержащее тип QMetaType::UnknownType. Это в основном происходит только при создании QVariant без присвоения значения.

QVariant m_model = 0; создаст QVariant с типом int. Не делай этого. Просто объявите это без = 0 части. QVariant (как и другие типы значений в Qt, т.е. QString, QSize et c.) Не нужно инициализировать, чтобы он был нулевым, пустым или недействительным. Если вы объявите это так, как вы, будет isValid() return true , хотя вы можете захотеть вернуть false .

Тем не менее я не уверен, чего вы хотите достичь в своем фрагменте кода. В основном вы тестируете m_model перед , присваивая ему новое непроверенное значение var (почему ???).

Как вы сказали, ваше значение var (или, возможно, содержащееся в нем значение) могло быть удалено непосредственно перед вызовом setValue(). Если объект QObject был удален, а указатель не был явно установлен на nullptr, вы передаете QVariant с висящим указателем на функцию. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 * * * 1036].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...