2016-10-29 2 views
3

Qt의 기초를 배우기 위해 매우 기본적인 시간표 앱을 만들려고합니다. 나는이 문제를 조금 연구했고 내 문제에 대한 해답을 얻지 못하는 것 같지만 내 피사체의 값을 바꿀 때 신호를 방출하지만 방출 신호는 GUI를 업데이트하지 않습니다. 코드에서 값을 확실히 변경하고 있지만 QML GUI는 런타임 중에 값을 업데이트하지 않습니다. 볼 때 (기간방출 신호가 GUI의 값을 업데이트하지 않습니다

Period *m_period = new Period[10]; //Of type Period (my other class) which holds my subject string 

나는 또한 일 기간에 대한 getter와 setter를 개최하는

Q_PROPERTY(Period *getPeriod READ getPeriod WRITE setPeriod NOTIFY periodChanged) 
    Q_PROPERTY(QString getDay READ getDay WRITE setDay NOTIFY dayChanged) 

및 회원 :

나는 다음과 같은 Q_PROPERTY의로 데이라는 클래스가 Q_PROPERTY에 있음) 및 주제 설정/가져 오기에 대한이 두 가지가 있습니다.

Q_INVOKABLE QString getSubject(int t){ 
    return m_period[t].getSub(); 
    }; 
    Q_INVOKABLE void setSubject(int t, QString subj){ 
    m_period[t].setSub(subj); 
    emit periodChanged(); 
    }; 

NG 신호 :

QString subject; 

내 기간 클래스를 개최 : 주제 이름을 개최

Q_PROPERTY(QString getSub READ getSub WRITE setSub NOTIFY subChanged) 

및 회원 : 나는 또한 다음 Q_PROPERTY와 시대라는 클래스가

void periodChanged(); 
    void dayChanged(); 

실제로 QString 주체를 변경하기 위해 호출 된 함수 :

QString getSub(){ 
    return subject; 
    }; 
    void setSub(QString sub){ 
    subject = sub; 
    emit subChanged(); 
    }; 
업데이트해야합니다 그래서 반드시 피사체가 setSubject를 (사용하여 변경됩니다 때

void subChanged(); 

) 내 QML, 그것은)는 periodChanged (발광하지 않아야하고, subChanged() 신호에서, 다음 신호 91,363,210

GUI? 그럴 것이라고 생각했지만 작동하지 않는 것 같습니다. 참고로

, 이것은 내가 QML에서이를 구현하는 방법 기본적으로 다음과 같습니다

Label { text: monday.getSubject(2) } //How I display the Subject, the parameter being the period number 

    Button{ 
     text: "Enter" 
     onClicked:{ 
      monday.setSubject(2, "RANDOM_TEXT") //How I set the subject at run time, with the first argument being the period number and second the text I want to change it to 
     } 

주 및 클래스 파일입니다

MAIN.CPP

int main(int argc, char *argv[]) 
{ 
QApplication app(argc, argv); 

qmlRegisterType<Day>("Timetable", 1,0, "Day"); 
qmlRegisterType<Period>("Timetable", 1,0, "Period"); 

QQmlApplicationEngine engine; 

Day monday; 
engine.rootContext()->setContextProperty("monday", &monday); 

engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 
QQmlComponent component(&engine, QUrl::fromLocalFile("main.qml")); 
component.create(); 

return app.exec(); 
} 

Day.h

class Day : public QObject 
{ 
Q_OBJECT 
Q_PROPERTY(Period *getPeriod READ getPeriod WRITE setPeriod NOTIFY periodChanged) 


private: 
     Period *m_period = new Period[10]; 

public: 
    Day(QObject *parent = 0); 
    ~Day(); 

    Period* getPeriod(); 
    Q_INVOKABLE void setPeriod(Period *p); 

    Q_INVOKABLE QString getSubject(int t){ 
    return m_period[t].getSub(); 
    }; 
    Q_INVOKABLE void setSubject(int t, QString subj){ 
    m_period[t].setSub(subj); 
    emit periodChanged(); 
    }; 

signals: 
    void periodChanged(); 
}; 

Period.h

class Period: public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString getSub READ getSub WRITE setSub NOTIFY subChanged) 

private: 
    QString subject; 

public: 
    Period(QObject *parent = 0); 
    ~Period(); 

    QString getSub(){ 
    return subject; 
    }; 
    void setSub(QString sub){ 
    subject = sub; 
    emit subChanged(); 
    }; 

signals: 
    void subChanged(); 
}; 

main.qml

ApplicationWindow { 
    id: mainWindow 
    visible: true 
    title: "Timetable App" 
    property int margin: 11 
    width: mainLayout.implicitWidth + 2 * margin 
    height: mainLayout.implicitHeight + 2 * margin 
    minimumWidth: 800 
    minimumHeight: 600 

ColumnLayout { 
    id: mainLayout 
    anchors.fill: parent 
    anchors.margins: margin 

    GroupBox{ 

     id: timetable 
     title: "Timetable" 
     Layout.fillWidth: true 
     Layout.fillHeight: true 

     GridLayout { 
      id: gridLayout 
      rows: 11 
      flow: GridLayout.TopToBottom 
      anchors.fill: parent 
      Layout.fillWidth: true 
      Layout.fillHeight: true 

      Label { } 
      Label { text: "8:00" } 
      Label { text: ...} // Added Labels for times from 8:00 to 17:00 

      Label { text: "Monday" } 
      Label { text: monday.getSubject(0) } 
      Label { text: monday.getSubject(1) } 
      Label { text: ...} // Added Labels to display subjects for monday at different times, also did the same for the rest of the week 
     } 
    } 

    RowLayout{ 
     Button{ 
      text: "Enter" 
      onClicked:{ 
       monday.setSubject(1, "RANDOM_TEXT") // Set the second period of monday to "RANDOM_TEXT" 
       console.log(monday.getSubject(1)) // To check if actually set 
      } 
     } 
    } 
} 
} 
+0

더 많은 정보가 필요하면 – HeinriG

+1

과 같은 코드 스 니펫을 사용해도 도움이되지 않습니다. 누락 된 부분은 main (C++과 QML을 연결하는 방법을보기 위해)과 최소화 된 QML과'monday' 선언입니다.이 시점에서 등록 된 시간과 컨텍스트 속성이 될 수 있습니다. – BaCaRoZzo

+0

@BaCaRoZzo - 머리를 가져 주셔서 감사합니다. 관련 코드를 모두 추가했습니다. – HeinriG

답변

3

귀하의 문제는 방법은없는 속성 바인딩을 통해, QML에서 호출을 통해 값을 검색하는 것입니다.이 같은

QML 코드가

text: monday.getPeriod.getSub 

분명히 호출 속성을 업데이트해야한다 "getSomething는"조금 이상한 것입니다.

지금, 당신의 m_period는 하나의 Day 객체가이 목록 속성 대신 하나의 Period 객체를 할 수 있습니다 것을 제안하는, 하나 이상의 Period있을 것이라는 점을 시사한다. 조금이

text: monday.periods[0].getSub 

처럼 심지어와 QML에서 그 사용

Q_PROPERTY(QList<Period*> periods READ getPeriods NOTIFY periodsChanged); 

같은 뭔가 예를 들어, NOTIFY 신호 업데이트를 바인딩 트리거, 그래서 당신은 불필요을 방출하고 싶지 않은 : 아니 당신의 업데이트와 관련된 문제뿐만 아니라 중요한 Repeater

Label { text: "Monday" } 
Repeater { 
    model: monday.periods 

    Label { 
     text: modelData.getSub 
    } 
} 

고려해야합니다. 나는. 그것들을 내보내는 setter는 새로운 값이 이전 값과 실제로 다른지를 먼저 확인하고 그 값이있는 경우에만 출력해야합니다.

+0

정말 고마워요! 나는 당신이 속성 바인딩을 부르지 않는다는 것에 대해 당신이 의미하는 것을 보았습니다. – HeinriG

관련 문제