2011-11-28 2 views
2

방금 ​​Qt로 작업하기 시작했습니다. 전체 신호 슬롯 시스템으로는 상당히 분실했습니다.
일반적인 개념을 이해하지만 GUI 코드를 디자인하는 올바른 방법이 무엇인지 이해할 수 없습니다. 서로 포인터를 가지고있는 클래스의 계층 구조라고 생각합니까? 예를 들어 주 창이있는 경우 W1 버튼을 사용하여 B1 버튼을 눌러 다른 창을 열어야합니다 (W2).
W1의 클래스 B1에 대한 포인터를 보유해야하지만, 내가 W2에 포인터를 유지해야 할 것 같다 '이유는 매우 분명하다 W2의 일부 사용자 지정 슬롯에 B1clicked() 신호를 연결하기위한 단자, S 클래스를 위해, 그리고 이유를 모르겠다 ... 시그널 - 슬롯 메커니즘이 일반적이고 특정 인스턴스가 아닌 설계가 아닌가? 이 예제의 코드를 디자인하는 올바른 방법은 무엇입니까?Qt로 GUI를 디자인하는 올바른 방법

답변

1

연결은 항상 클래스의 인스턴스간에 만들어집니다. 신호 및 슬롯은 클래스 B의 한 인스턴스에 클래스 A의 인스턴스에 변경 또는 이벤트가 있음을 알리는 메커니즘입니다.

아래는 버튼 B1이 클릭 될 때 창 W2를 표시하는 클래스 W1의 디자인입니다. 클래스 W1의 초기화를 건너 뛰고, 윈도우의 UI를 생성하는 방법이 거의 없기 때문에 B1 버튼을 얻습니다. 연결이 성공했는지 확인해 보았습니다. 안전을 위해서였습니다. 여기

class W1 :public QWidget 
{ 
public: 
A(QWidget *parent = 0):QWidget(parent) 
{ 
    //init 
    B1 = getB1(); 
    if(!connect(B1,SIGNAL(clicked()),this,SLOT(show_W2()))) 
     qFatal("%s %i connection failed B1->clicked this->show_W2",__FILE__,__LINE__); 
} 

public slots: 
    void show_W2() 
    { 
     QWidget *W2 = new Window2(this->parent()); 
     //create window 
    } 
protected: 
    QPushButton *B1; 
} 

클래스 W1은 클래스 W2에 대해 지금은 아무것도하지 마십시오 예를 들어, 서로 다른 접근 방식 :

나는 짓을 정확히하지만 어떻게이 위젯 사이에 연결을 만들려면 어떻게해야합니까
class W1 :public QWidget 
{ 
public: 
A(QWidget *parent = 0):QWidget(parent) 
{ 
    //init 
    B1 = getB1(); 
    if(!connect(B1,SIGNAL(clicked()),this,SIGNAL(B1_clicked()))) 
     qFatal("%s %i connection failed B1->clicked this->B1_clicked",__FILE__,__LINE__); 
} 

signals: 
    B1_clicked() 
} 

void MainWindow::creatW1() 
{ 
    W1 *_w1 = new W1; 
    if(!connect(_w1,SIGNAL(B1_clicked()),this,SLOT(createW2()))) 
     qFatal("%s %i connection failed _w1->B1_clicked this->show_W2",__FILE__,__LINE__); 
} 
+0

위젯 클래스를 올바르게 초기화하는 방법은 어디에서 찾을 수 있습니까? – Sugar

+0

Ui 초기화를 의미합니까? Qt Creator를 설치 한 경우 "Create form"옵션으로 Qt GUI 프로젝트를 생성하고 생성 된 코드를 확인하십시오. 이것은 대부분의 경우에 권장되는 초기화 방법입니다. – firescreamer

+0

대부분의 경우 UI 초기화는 수동입니다. Qt의 예제와 튜토리얼에서도 그렇습니다. 그것은 약간 충격적입니다. 생성 된 코드가 도움이되었습니다. – Sugar

3

이 예제 코드를 디자인하는 올바른 방법은 무엇입니까?

Qt 디자이너로 간단한 UI를 만들고 생성 된 내용을 살펴보십시오. Qt로 시작할 때 그 점이 도움이되었습니다.

+0

/수업? 신호 슬롯 편집기는 다른 클래스 슬롯을 인식하지 못합니다 ... –

+2

코드에서 수동으로 연결하십시오. QObject :: connect()를 참조하십시오. – arrowd

관련 문제