2011-01-10 6 views
4

Qt는 다음과 같이 Ui 인터페이스 안에 클래스를 넣습니다.클래스를 네임 스페이스 안에 넣기

namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    ... 

이 메서드는 네임 스페이스 내에 전체 클래스를 포함하는 것과 같은가요? 분명히 깨끗해 보입니다.

+0

Qt에서이 부분을 보았습니까? 링크를 제공 할 수 있습니까? 유효한 C++이지만 전역 네임 스페이스의'MainWindow'와'Ui' 네임 스페이스는 컴파일러가 관련된 한 다른 클래스입니다.두 MainWindow가 실제로 Ui 네임 스페이스 안에 있지 않으면 어딘가에 놓쳤습니다. 네임 스페이스가 여러 파일로 분할 될 수 있습니다. –

+0

@Insilico 새로운 GUI 프로젝트를 만들면 그것을 볼 수 있습니다. 흠, 나는 코드 자체를 정말로 이해하지 못한다. – wrongusername

답변

9

아니요, 예제에서 Ui::MainWindow은 글로벌 네임 스페이스에 정의 된 MainWindow 클래스와 다른 클래스입니다.

보라 : Ui::MainWindow 이후

namespace Ui { 
    class MainWindow; 
} 

class MainWindow 
{ 

}; 

int main() 
{ 
    Ui::MainWindow mw; // fails due to incomplete type 
} 

이 코드는 컴파일되지 않습니다가, 불완전한 유형입니다.

아마도 Qt 코드는 전달 선언을 사용했을 가능성이 큽니다. 네임 스페이스에서 클래스 선언을 전달할 수 있지만 여전히 동일한 네임 스페이스에 클래스를 구현해야합니다. 그렇지 않으면 동일한 클래스가 아닙니다.

+0

즉, OP의 클래스가 네임 스페이스 선언 (생략 된 코드?)에 래핑되지 않고 네임 스페이스의 MainWindow 선언이 단순히 자체 선언과 실제 정의 사이의 다른 것에 의해 사용되는 포워드 선언 인 경우가 아니면 ... 다시, 나 자신보다 앞설 가능성이 높다.) +1 –

1

두 클래스가 다릅니다. 당신이 말하는 것은 Qt가 아니라 디자이너를 사용하여 UI 객체를 생성 한 결과입니다. Qt는 생성 된 코드를 신호 전달 함수와 같은 논리로 추가 할 수있는 것과 분리 시키려고하기 때문에 올바르게 처리합니다. 그렇지 않으면 다음 세 가지 중 하나를 수행 할 수 있어야합니다.

1) 디자이너가 수정해야하는 것과 사용자가 원하지 않는 것의 차이점을 알려주십시오. 충돌을 임의로 해결해야하는 신비한 방법으로 해결합니다.

2) 사용자가 변경 한 모든 것을 무시하십시오.

3) 사용자가 삭제하지 않았 으면 파일을 변경하지 않습니다.

첫 번째 작업은 많은 작업이며 개발자가 무엇을 선택했는지, 누군가 어딘가에 불편을 겪습니다. 두 번째 대안은 당연히 사용자가 UI를 변경할 때마다 작성되는 모든 슬롯 코드가 파괴되기 때문에 사람들을 화나게 할 것입니다. 이는 거의 모든 시간에 매우 불편할 것입니다. 세 번째는 여러 가지 이유로 편리하지 않을 것입니다.

그래서 개발자가 생성 한 UI 개체와 개발자/사용자가 작성한 부분을 구분합니다. 이를 통해 개발자는 특정 잘 정의 된 영역의 변경 사항을 간단하게 없애고 개발자가 필요한 행동을 추가하지 않고도 추가 할 수 있습니다.

일반 프로그램 디자인에서 일반적으로하는 일이 아닙니다. 자동 생성 된 코드와 관련하여 상당히 특정한 문제를 해결하기 위해이 방법을 사용했습니다. 그것은 상당히 잘 생각한 접근 방식입니다. 이 수

 class Ui_MainWindow 
     { 
     // auto-generated stuff 
     }; 

     namespace Ui { 
      class MainWindow: public Ui_MainWindow {}; 
     } 

당신이 당신의 클래스의 이름으로 MainWindow을 사용하고 여전히 자동 생성 된 UI 클래스 MainWindow 전화 :

0

일반적으로, uic는 다음과 같이 헤더를 만든다. Ui::MainWindow은 전달 선언이 아닌 전체 클래스 정의입니다.

관련 문제