2017-12-10 10 views
1

Classes, Class AClass B 두 개가 서로 액세스 할 수 있습니다.
Class A에는 이라는 QVBoxLayout이 있고 다른 모든 레이아웃은 mVLayout에 추가됩니다.
a.cpp에서 :한 클래스에서 다른 클래스로 레이아웃 추가 Qt에서 작동하지 않는 클래스

A::A(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    B testingB; //Class B object 
    mWidget = new QWidget(this); 
    setCentralWidget(mWidget); 
    mVLayout = new QVBoxLayout(mWidget); 
    mVLayout->addLayout(testingB.mHLayout); //adding Class B mHLayout to Class A mVLayout; 
    mWidget->setLayout(mVLayout); 
} 

b.h의 :

class A; 

class B 
{ 
public: 
    B(); 
    QHBoxLayout *mHLayout; 
    A *testingA; //Class A object 
}; 

b.cpp :

B::B() 
{ 
    QPushButton *btn1 = new QPushButton("Btn1"); 
    QPushButton *btn2 = new QPushButton("Btn2"); 
    mHLayout = new QHBoxLayout; 
    mHLayout->addWidget(btn1); 
    mHLayout->addWidget(btn2); 
} 

이 지금까지 잘 작동합니다. 하지만 그 두 가지를 만든 이유는 ClassesmHLayoutmVLayoutClass B에 추가하려는 것입니다. 레이아웃을 추가하는 적절한 방법은 위에서 언급 한 방법 일 수 있습니다. 하지만 Class A mVLayoutClass B에 레이아웃을 추가하려면 어떻게해야합니까?

나는이 시도 : 새 줄을 추가하여, Class B 생성자 (나는 또한 Class A 생성자에서 addlayout 라인 제거) :
testingA->mVLayout->addLayout(mHLayout);

을 나는이 시도 :

testingA = new A; 
testingA->mVLayout->addLayout(mHLayout); 

을하지만 밝혀졌다

The program has unexpectedly finished. The process was ended forcefully.



왜 이런 일이 것 :이 오류가있어? 그리고 누군가 Class A에 레이아웃을 추가하는 방법을 Class B에 제공 할 수 있습니까?
감사합니다. 그냥 예를 들어 (이 같은 B의 생성자를 한 경우

답변

2

나는 그것이 이후에해야할 것에 먼저해야할 것에 문제라고 생각 ...

, 당신은 사용하여 A와 B의 인스턴스를 전달할 수 있습니다 방법) :

B::B(A*a) 
{ 
    QPushButton *btn1 = new QPushButton("Btn1"); 
    QPushButton *btn2 = new QPushButton("Btn2"); 
    mHLayout = new QHBoxLayout; 
    mHLayout->addWidget(btn1); 
    mHLayout->addWidget(btn2); 
    a->mVLayout->addLayout(mHLayout); //here you add the layout 
} 

그러나 A의 생성자에서

:

A::A(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    mWidget = new QWidget(this); 
    setCentralWidget(mWidget); 
    mVLayout = new QVBoxLayout(mWidget); 
    mWidget->setLayout(mVLayout); 

    B b(this); 
} 

당신이 B의 생성자를 호출 (과에 A의 인스턴스를 전달한다)는 A의 위젯과 레이아웃을 설정 한 후.

분명히 A 생성자에서 B 인스턴스를 만들지 않아도됩니다. 이 라인

B b(this); 

를 제거하면 당신은뿐만 아니라 작동하는

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    A a(0); 
    B b(&a); 
    a.show(); 
    return app.exec(); 
} 

을 할 수 있습니다.