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
}
}
}
}
}
더 많은 정보가 필요하면 – HeinriG
과 같은 코드 스 니펫을 사용해도 도움이되지 않습니다. 누락 된 부분은 main (C++과 QML을 연결하는 방법을보기 위해)과 최소화 된 QML과'monday' 선언입니다.이 시점에서 등록 된 시간과 컨텍스트 속성이 될 수 있습니다. – BaCaRoZzo
@BaCaRoZzo - 머리를 가져 주셔서 감사합니다. 관련 코드를 모두 추가했습니다. – HeinriG