QT에서는 코드의 변수와 일치하는 위젯을 어떻게 구현합니까?
문제
다음은 기본 변수에 대한 변경 사항을 작성하는 스핀 박스 샘플입니다. 내가 가진 주요 문제는 위젯이 구성 될 때 ValueChanged입니다. 더 우아한 방법이 있습니까? 위젯을 그 자체로 연결하는 것이 이상하다고 생각하지만 Valuechanged는 가상이 아닙니다.
class ValueWriterInt: public QSpinBox {
Q_OBJECT
public:
ValueWriterInt(vector<int*> const& value): myValue(value) {
QObject::connect(this, SIGNAL(valueChanged(int)), this, SLOT(valueChanged(int)));
}
~ValueWriterInt() {}
private slots:
void valueChanged(int new_value) {
for (auto it = myValue.begin(); it != myValue.end(); ++it)
**it = new_value;
}
private:
vector<int*> myValue;
};
해결책
나는 위젯을 그 자체로 연결하는 것에 대해 특별히 이상한 것은 없습니다. 데이터 업데이트를 감지하고 응답하는 단일 방법을 갖는 것은 디버깅 시점을 확인하지 못하는 지점이 적기 때문에 실제로 좋은 것 같습니다. 특정한 경우에는 바람직하지 않은 행동을 일으키지 만 일반적으로 훌륭한 해결책입니다.
이제 반사적 연결이 본질적으로 무능하지 않다는 의견을 표명 한 후, 나는 "우아한"솔루션을 호출하는 것을 방지하기위한 "우아한"솔루션을 제안 할 것입니다. valueChanged
시공 후. 객체가 방금 구성되었는지 여부를 결정하고 조기에 코드가 실행되는 것을 방지하기 위해 깃발을 가질 수 있습니다. 예에서 :
class ValueWriterInt: public QSpinBox {
Q_OBJECT
public:
ValueWriterInt(vector<int*> const& value): myValue(value), myAfterInit(true) {
QObject::connect(this, SIGNAL(valueChanged(int)), this, SLOT(valueChanged(int)));
}
~ValueWriterInt() {}
private slots:
void valueChanged(int new_value) {
if (myAfterInit) {
myAfterInit = false;
return;
}
for (auto it = myValue.begin(); it != myValue.end(); ++it)
**it = new_value;
}
private:
vector<int*> myValue;
boolean myAfterInit;
};
그것은 해결책이 나쁘지 않습니다. 그것은 더 우아한 방법을 찾을 수있을 때까지 원하는 행동을 줄 것입니다.
다른 팁
그래서 여기서 무엇을 성취하려고합니까? 그렇습니다 그들 자신 그들이 반응하고 싶은 신호에 대한 슬롯.
신호 슬롯 연결을 사용하는 것 외에는 다른 대안이 없습니다. 그러나 슬롯의 이름을 변경하므로 신호와 같은 이름이 없습니다.
아직 연결이 완료되지 않은 경우에도 슬롯이 어떻게 호출되는지 흥미 롭습니다. 슬롯 이름을 변경하면 해당 문제가 해결 될 것으로 생각됩니다.