QT에서는 코드의 변수와 일치하는 위젯을 어떻게 구현합니까?

StackOverflow https://stackoverflow.com/questions/818981

  •  03-07-2019
  •  | 
  •  

문제

다음은 기본 변수에 대한 변경 사항을 작성하는 스핀 박스 샘플입니다. 내가 가진 주요 문제는 위젯이 구성 될 때 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;
};

그것은 해결책이 나쁘지 않습니다. 그것은 더 우아한 방법을 찾을 수있을 때까지 원하는 행동을 줄 것입니다.

다른 팁

그래서 여기서 무엇을 성취하려고합니까? 그렇습니다 그들 자신 그들이 반응하고 싶은 신호에 대한 슬롯.

신호 슬롯 연결을 사용하는 것 외에는 다른 대안이 없습니다. 그러나 슬롯의 이름을 변경하므로 신호와 같은 이름이 없습니다.

아직 연결이 완료되지 않은 경우에도 슬롯이 어떻게 호출되는지 흥미 롭습니다. 슬롯 이름을 변경하면 해당 문제가 해결 될 것으로 생각됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top