Violation d'accès en lecture avec QMetaObject
Bonjour, à tous,
Je viens ici car j'ai un problème avec un code récupéré d'une ancienne version de Qt (5.6 et de mon côté je suis en 5.12.5). Lors du lancement, j'ai droit à une exception disant "The inferior stopped because it triggered an exception. Stopped in thread 0 by exception at 0x796d5058, code: 0xc0000005: read access violation at 0x10, flags=0x0 (first chance)." sous Qt Creator et "Exception levée à 0x01A35058 (Qt5Cored.dll) dans TestBench.exe*: 0xC0000005*: Violation d'accès lors de la lecture de l'emplacement 0x00000010.".
La ligne en question est la suivante:
Code:
m_handler = metaObject ()->method (metaObject ()->indexOfMethod (HANDLER));
La partie posant problème est l'appel à la méthode "indexOfMethod". Le code est le suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| class QQmlObjectListModelBase : public QAbstractListModel { // abstract Qt base class
Q_OBJECT
Q_PROPERTY (int count READ count NOTIFY countChanged)
public:
explicit QQmlObjectListModelBase (QObject * parent = Q_NULLPTR) : QAbstractListModel (parent) { }
public slots: // virtual methods API for QML
virtual int size (void) const = 0;
virtual int count (void) const = 0;
virtual bool isEmpty (void) const = 0;
virtual bool contains (QObject * item) const = 0;
virtual int indexOf (QObject * item) const = 0;
virtual int roleForName (const QByteArray & name) const = 0;
virtual void clear (void) = 0;
virtual void append (QObject * item) = 0;
virtual void prepend (QObject * item) = 0;
virtual void insert (int idx, QObject * item) = 0;
virtual void move (int idx, int pos) = 0;
virtual void remove (QObject * item) = 0;
virtual void remove (int idx) = 0;
virtual QObject * get (int idx) const = 0;
virtual QObject * get (const QString & uid) const = 0;
virtual QObject * getFirst (void) const = 0;
virtual QObject * getLast (void) const = 0;
virtual QVariantList toVarArray (void) const = 0;
protected slots: // internal callback
virtual void onItemPropertyChanged (void) = 0;
signals: // notifier
void countChanged (void);
};
template<class ItemType> class QQmlObjectListModel : public QQmlObjectListModelBase {
public:
explicit QQmlObjectListModel (QObject * parent = Q_NULLPTR,
const QByteArray & displayRole = QByteArray (),
const QByteArray & uidRole = QByteArray ())
: QQmlObjectListModelBase (parent)
, m_count (0)
, m_uidRoleName (uidRole)
, m_dispRoleName (displayRole)
, m_metaObj (ItemType::staticMetaObject)
{
static const char* HANDLER = "onItemPropertyChanged()";
m_handler = metaObject ()->method (metaObject ()->indexOfMethod (HANDLER));
if (!displayRole.isEmpty ()) {
m_roles.insert (Qt::DisplayRole, QByteArrayLiteral ("display"));
}
}
void onItemPropertyChanged (void) Q_DECL_FINAL
{...} |
J'ai tenté de remplacer la ligne en question par le code suivant mais j'ai toujours le même problème.
Code:
1 2 3 4
| const QMetaObject* pObject = metaObject();
QByteArray signature= pObject->normalizedSignature(HANDLER);
int idx = pObject->indexOfMethod(signature.data());
m_handler = pObject->method(idx); |
Si quelqu'un à une idée.
Merci d'avance.