2016-10-29 13 views
3

Qtの基本を学ぶために非常に基本的なタイムテーブルアプリを作ろうとしています。私はこれをかなり研究し、私の問題の答えを得るように思わない、私は私の被写体の値を変更する信号を放出するが、放射信号は、GUIを更新しません。これは間違いなくコードの値を変更していますが、QML GUIは実行時にその値を更新しません。GUIの値を更新しない発光信号

私は、次のQ_PROPERTYの日と呼ばれるクラスがあります見られるように、私も(日および期間のゲッターとセッターを持って

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

と期間

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

を保持するメンバーをQ_PROPERTY内の)これらの2つは、被写体を設定/取得するためのものである。

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()信号で、次の信号で

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

のようなコードスニペットを使用することは役に立ちません。欠落しているのはメイン(あなたがC++とQMLをどのように橋渡ししたかを見るために)と、この時点では登録された時間でもコンテキストプロパティでもある 'monday'宣言で最小化されたQMLです。 – BaCaRoZzo

+0

@BaCaRoZzo - ヘッドアップをありがとう、私はすべての関連コードを追加しました、うまくいけば、これを明確にします。 – HeinriG

答えて

3

あなたの問題は、あなたがいないプロパティのバインディングを経て、QMLでメソッド呼び出しを経由して値を取得していることです。このような

A 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); 

のようなもの、例えば考えるためにあなたの更新の問題も重要に関連していないRepeater

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

    Label { 
     text: modelData.getSub 
    } 
} 

NOTIFY信号がバインディング更新をトリガーするので、あなたは不必要にそれらを放出する必要はありません。私。それらを発行するセッターは、新しい値が実際には古い値と異なるかどうかをまずチェックし、存在する場合にのみ放出しなければなりません。

+0

ありがとうございました!私は、プロパティのバインディングを呼び出さないことについてあなたが意味するものを見る、トリックを行ったようだ! – HeinriG

関連する問題