2013-12-11 2 views
0

QWidget-Class의 구성원은 일반적으로 개인 또는 공용으로 설계해야합니까?QWidget을 어떻게 디자인합니까?

class MyWidget : public QWidget { 

    public: 
     MyWidget(QWidget *parent = 0); 
     QLineEdit *myLine; 
} 

또는

class MyWidget : public QWidget { 

    public: 
     MyWidget(QWidget *parent = 0); 

    private: 
     QLineEdit *myLine; 
} 

본인은 개인 회원과 두 번째 정의를 선호하지만, 나는 findChild (QString)와 회원에 액세스 할 수 없기 때문에이 버전은 테스트 나쁘다.

다른 부분은 QWidget 클래스 중첩 된 다른 위젯이어야합니까? 문제는 중첩 된 위젯에 직접 액세스 할 수 없기 때문에 마우스 클릭으로 버튼이나 다른 것을 눌러야하는 자동화 된 GUI 테스트에는 유용하지 않습니다.

+0

무엇이'QLineEdit * MyWidget :: getLineEdit() const'와 같은 클래스에 멤버 함수를 추가하지 못하게합니까? – vahancho

+0

왜이 솔루션에서 개인 수식어를 사용해야합니까? #define private public도 가능하지만 좋은가요? – Andreas

+0

'#define private public'? 농담입니까? – vahancho

답변

2

두 번째 선택 항목은 일반적으로 "최상의 프로그래밍 실습 "을 배우고, 다른 곳의 코드 (테스트 스위트 포함)를 통해 비공개 멤버에 액세스해야하는 경우 getters와 setter를 구현해야합니다.

일반적으로 테스트 프레임 워크는 멤버 테스트에 일반적으로 필요한 API이기 때문에 일반적으로 멤버에 직접 액세스하는 대신 API에 액세스해야합니다. 테스트 프레임 워크가 비공개 멤버에 직접 액세스해야한다는 개념을 포기할 수 없다면 C++ 친구 클래스를 사용할 수 있습니다. 하지만 당신은 그 말을 내게 들리지 않았습니다.

문자열 이름과 같이 일반적으로 액세스해야하는 경우 정확히 Qt Properties이 당신을 위해 설계된 것입니다. 그래서 귀하의 항목을 속성으로 선언하고 getters/setters/signals/etc를 그 방식으로 나열하십시오.

단점 : 불행히도 getter 및 setter를 구현하는 것은 다소 지루한 작업이므로 getter, setter를 구현하고 신호 정의를 생성하고 신호를내는 QtCreator plugin tool을 구현해야합니다. 앞으로 좀 더 복잡한 것을 실제로 수행해야한다면 자동 제거/설정 도구를 제거하고보다 복잡한 정의로 대체하십시오.