2017-12-10 8 views
1

私は2つの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); 
} 

これは、これまで正常に動作します。しかし、私がそれらの2つを作った理由は、mHLayoutmVLayoutClass Bに追加したいということです。おそらく、レイアウトを追加する適切な方法は、上記の方法です。しかし、もしClass A mVLayoutClass Bのレイアウトを追加したいのであれば、それは可能ですか?

私はこれを試してみました:新しい行(私もClass Aコンストラクタでaddlayoutラインを削除)を追加することによって、Class Bコンストラクタで:
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に提供できますか?
ありがとうございます。

答えて

2

私はあなたがこのようなBのコンストラクタ(単なる一例を作る場合は、使用してBにAのインスタンスを渡すことができ

...後に行われなければならないものを、それが最初に行われなければなら何の問題だと思います法):

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); 
} 

あなたはAのウィジェットやレイアウトを設定した後、あなたが)Bのコンストラクタを呼び出し(およびそれに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(); 
} 

を行うことができます。

関連する問題