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
}
}
}
}
}
さらに詳しい情報が必要な場合は、 – HeinriG
のようなコードスニペットを使用することは役に立ちません。欠落しているのはメイン(あなたがC++とQMLをどのように橋渡ししたかを見るために)と、この時点では登録された時間でもコンテキストプロパティでもある 'monday'宣言で最小化されたQMLです。 – BaCaRoZzo
@BaCaRoZzo - ヘッドアップをありがとう、私はすべての関連コードを追加しました、うまくいけば、これを明確にします。 – HeinriG