2013-04-02 3 views
3

SectionScroller & QAbstractListModel과 함께 ListView을 사용 중입니다. 정상적으로 스크롤 할 때 (결코 명시 적으로 호출되지 않음) 세그먼트 화 오류가 있음을 알았습니다 (SectionScroller 사용하지 않음)QML 목록보기 및 분할 오류

왜 이런 일이 발생하는지 알고 있습니까?

내가 재현하려고 이제 세그멘테이션 폴트

0x402f9c3a는에 ??() /usr/lib/libQtScript.so.4
0x402f9c3a에서 : 더 가치있는 정보가 덤프되지 않습니다하지만

[R3, R7] ldrh의 R1, 디버그 심볼이있다. AFAIK N900의 프로세서이기 때문에 119

그것은 이상한 : 다른 시간 세그먼트 폴트는 /usr/include/QtCore/qatomic_armv6.h에서 (이를 0x0 =) QBasicAtomicInt : 심판의

0x0000cab8했다 armv7/edit : N950에서는 동일한 것을 사용하고 Qt 소스는 ARM qatomic_arm.hqatomic_armv6.h에만 해당하므로 잘해야합니다.

ListView{ 
    id: irrview 
    width: parent.width 
    model: irregulars 
    anchors.top: caption.bottom 
    anchors.bottom: parent.bottom 
    spacing: 5 
    clip: true 
    section.criteria: ViewSection.FirstCharacter 
    section.property: "form0" 

    delegate: Rectangle{ 
     id: del 
     property int fontSize: 20 
     height: 60 
     width: parent.width 
     color: "#E0E1E2" 
     Row{ 
      height: parent.height 
      width: parent.width - 10 
      anchors.horizontalCenter: parent.horizontalCenter 
      property real columnWidth: (width - 10)/3 
      property int rad: 10 
      spacing: 5 
      Rectangle{ 
       height: parent.height 
       width: parent.columnWidth 
       radius: parent.rad 
       color: "lightsteelblue" 
       Text{ 
        anchors.centerIn: parent 
        text: form0 
        font.pointSize: del.fontSize 
       } 
      } 
      Rectangle{ 
       height: parent.height 
       width: parent.columnWidth 
       radius: parent.rad 
       color: "lightsteelblue" 
       Text{ 
        anchors.centerIn: parent 
        text: form1 
        font.pointSize: del.fontSize 
       } 
      } 
      Rectangle{ 
       height: parent.height 
       width: parent.columnWidth 
       radius: parent.rad 
       color: "lightsteelblue" 
       Text{ 
        anchors.centerIn: parent 
        text: form2 
        font.pointSize: del.fontSize 
       } 
      } 
     } 
    } 
} 

모델이다

#ifndef IRREGULARLISTWRAPPER_H 
#define IRREGULARLISTWRAPPER_H 

#include <QObject> 
#include <QList> 
#include <QAbstractListModel> 
#include <QMap> 
#include "IrregularVerb.h" 
#include "AbstractIrregularList.h" 

class IrregularListWrapper : public QAbstractListModel 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString langName READ getLangName NOTIFY langChanged) 
    Q_PROPERTY(int count READ rowCount NOTIFY langChanged) 
    Q_ENUMS(Language) 
public: 

    Q_INVOKABLE int rowCount(const QModelIndex& = QModelIndex()) const { return db->count(); } 
    Q_INVOKABLE QObject* get(int index) const {return db->at(index);} 
    QVariant data(const QModelIndex &index, int role) const; 

    enum Language 
    { 
     English = 0, 
     German = 1 
    }; 

    enum IrregularVerbRoles 
    { 
     Form0Role = Qt::UserRole + 1, 
     Form1Role, 
     Form2Role 
    }; 

    IrregularListWrapper(); 

// ~IrregularListWrapper() { delete db; } 
// QList<QObject*> getdb() const { return *db; } 

    QString getLangName() const { return langName; } 
    Q_INVOKABLE void changeLang(Language l) { beginResetModel(); db = 0; /*QList<IrregularVerb*>();*/ setLang(l); endResetModel(); } 

    static QMap<Language, QString> plugins; 

signals: 
    void langChanged(); 
protected: 
    void setLang(Language); 
    //QList<IrregularVerb*> db; 
    QString langName; 
    AbstractIrregularList * db; 

}; 

#endif // IRREGULARLISTWRAPPER_H 


QMap<IrregularListWrapper::Language, QString> IrregularListWrapper::plugins; 

IrregularListWrapper::IrregularListWrapper() 
{ 
    QHash<int, QByteArray> roles; 
    roles[Form0Role] = "form0"; 
    roles[Form1Role] = "form1"; 
    roles[Form2Role] = "form2"; 

    const QString pluginPath = "/opt/MeeIrregulars/share/lib%1.so"; 

    plugins[English] = pluginPath.arg("english"); 
    plugins[German] = pluginPath.arg("german"); 

    setRoleNames(roles); 
    setLang(German); 
} 

QVariant IrregularListWrapper::data(const QModelIndex &index, int role) const 
{ 
    if (!index.isValid()) return QVariant(); 
    const IrregularVerb* verb = db->at(index.row()); 
    switch (role) 
    { 
    case Form0Role: 
     return verb->getForm0(); 
     break; 
    case Form1Role: 
     return verb->getForm1(); 
     break; 
    case Form2Role: 
     return verb->getForm2(); 
     break; 
    } 
    return QVariant(); 
} 

void IrregularListWrapper::setLang(Language l) 
{ 
    QPluginLoader loader(plugins[l]); 
    db = qobject_cast<AbstractIrregularList*>(loader.instance()); 

    if (db == 0) db = new AbstractIrregularList; 

    switch (l) 
    { 
    case English: 
     langName = "English"; 
     break; 
    case German: 
     langName = "German"; 
     break; 
    } 
    emit langChanged(); 

} 


class IrregularVerb : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString form0 READ getForm0 NOTIFY formChanged) 
    Q_PROPERTY(QString form1 READ getForm1 NOTIFY formChanged) 
    Q_PROPERTY(QString form2 READ getForm2 NOTIFY formChanged) 
public: 
    QString forms[3]; 
    QString getForm0() const { return forms[0]; } 
    QString getForm1() const { return forms[1]; } 
    QString getForm2() const { return forms[2]; } 
    IrregularVerb(QString a, QString b, QString c) { forms[0] = a; forms[1] = b; forms[2] = c; } 
signals: 
    void formChanged(); 
}; 

역 추적 :

# 0 QBasicAtomicInt :: REF (이 0x18를 =)
1 QString (이 0xbe88d2a0 다른 =를 =. ..)
# 2 IrregularVerb :: getForm2 (this = 0x9e6de8)
# 3 IrregularVerbWrapper :: data (this = 0x9e31b8, index = ..., role = 35)
// 모델
// libQtDeclarative에 대한 일부 호출

감사합니다.

+0

ARM 또는 모든 플랫폼에서만 사용할 수 있습니까? – dtech

+0

x86_64에서도 충돌이 발생합니다. – marmistrz

+0

문제를 해결할 수 있었습니까? –

답변

1

소유권에 문제가있었습니다. get이 반환 한 요소는 JS가 소유하고 자동으로 삭제되었습니다. 자세한 내용은 this answer을 참조하십시오.