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:
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 m_handler = metaObject ()->method (metaObject ()->indexOfMethod (HANDLER));
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
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 {...}
Si quelqu'un à une idée.
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);
Merci d'avance.
Partager