2009-04-21 4 views
1

메시지를 서로 분리하는 두 개의 프로세스가 있습니다. 프로세스 A는 메시지를 프로세스 B에 보내는 일반 (즉, qt가 아닌) 프로그램입니다. 프로세스 B는받은 메시지를 텍스트 상자에 표시하는 QT GUI 응용 프로그램입니다.디자이너와 런타임 코드를 구분하십시오

QPlainTextEdit에서 상속받은 사용자 정의 위젯 (ShowMessages)을 작성했으며 타이머가 만료되면 파이프에서 메시지를 읽어 텍스트 상자에 추가합니다. 코드는 실제로 이런 식으로 설계된 것은 아닙니다. (이것은 내가 생각하기에 꽤 나쁜 디자인입니다.)하지만 여기서는 단순하게 만들뿐입니다. qt-designer를 사용하여 양식을 작성하는 동안 프로세스 A를 종료 할 수없는 이유에 대해서는 설명하지 않겠습니다.

문제는 제가 디자이너에 있어도 qt 디자이너를 사용하여 (따라서 ShowMessages 위젯을 선택하고 창 안에 넣는 동안) 위젯이 메시지를 표시하기 시작한다는 것입니다. 이 기능은 멋지지만 문제는 양식을 저장할 때 이미 존재하는 메시지가 .ui 파일에 저장되므로 프로세스 B를 시작할 때 잘못된 동작이 발생한다는 것입니다 (프로세스가 생성 단계에서받은 메시지를 표시하기 때문에) .

프로세스 B가 시작된 직후에 텍스트 상자를 지울 수는 있지만, .ui 파일에있는 메시지를 피하는 것이 훨씬 낫다고 생각합니다. 내가 원하는 것은 위젯을 위해 다음과 같은 코드를 작성하는 것입니다 :

if <I'm not in the designer> 
    timer = QtCore.QTimer(self) 
    QtCore.QObject.connect(timer, QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("on_timer()")); 
    timer.start(2000) 

제가 디자이너에 있는지 알 수있는 Qt 함수가 있습니까? 디자이너와 런타임 코드를 구별하는 것이 "나쁘다"고 생각합니까?

(실수 미안하지만, 영어 내 기본 언어가 아닙니다)

답변

1

어쩌면 당신의 위젯은 "활성"여부에 대한 플래그가 있고 디자이너에있는 동안, 그래서 거짓으로 기본합니다, 그것은 아무튼 전혀 아무것도하지 마라. 코드에서 메시지를보고 싶을 때 코드를 활성화로 설정합니다. 그런 다음 다른 시나리오에서도이 기능을 끌 수 있습니다.

하지만 "컨트롤러"코드를 "뷰"위젯에 넣는 것처럼 들리 겠지만, 현재의 Qt 디자이너 문제를 포함하여 길 아래로 문제를 불러 일으킬 수 있습니다. 지금).

MVC (model-view-controller) 디자인 패턴을 아직 읽지 않았다면 읽어보십시오.

업데이트 :

공정하게, 당신의 질문은 당신이

http://doc.trolltech.com/4.3/designer-creating-custom-widgets.html#creating-well-behaved-widgets

사용자 정의를 제공하려면 : 디자이너에있어 여부를 감지하는 방법을 물어 않았다는 특별한 동작을 위젯 Qt Designer는 위젯을 구성하기 위해 초기화() 함수 구현을 제공합니다. construction p Qt 디자이너 의 특정 동작. 이 함수는 처음으로 을 호출하기 전에 을 호출하고, 은 플러그인의 createWidget() 함수를 호출 할 때 나중에 이 될 수있는 내부 플래그를 설정할 수 있습니다.

doc에 따르면 기본적으로 위젯의 initialize() 함수에서 "inDesignerFlag"를 true로 설정할 수 있습니다. 그런 다음 위젯의 코드에서 플래그가 필요한 곳을 감지하십시오.

관련 문제