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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.