【问题标题】:Adding layout from one Class to another Class not working in Qt将布局从一个类添加到另一个类在 Qt 中不起作用
【发布时间】:2018-05-24 04:11:02
【问题描述】:

我有两个ClassesClass AClass B,它们可以相互访问。
Class A 我有一个QVBoxLayout,称为mVLayout,所有其他布局都将是添加到mVLayout
a.cpp:

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

到目前为止,这工作正常。但是我之所以让这两个Classes可以互相访问是因为我想在Class B中将mHLayout添加到mVLayout。也许添加布局的正确方法是上面提到的方法。但是,如果我确实想在Class B 中为Class A mVLayout 添加布局,那可行吗?

我试过这个:在Class B构造函数中,通过添加一个新行(我还删除了Class A构造函数中的addlayout行):
testingA->mVLayout->addLayout(mHLayout);

我也试过这个:

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

但结果我收到了这个错误:

程序意外结束。 进程被强行结束。


为什么会这样?有人可以提供一种在Class B 中为Class A 添加布局的方法吗?
谢谢。

【问题讨论】:

    标签: c++ qt layout


    【解决方案1】:

    我认为这是先做什么,后做什么的问题......

    如果你像这样制作 B 构造函数(只是一个例子,你可以使用方法将 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);
    }
    

    您应该在设置 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();
    }
    

    同样有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 2013-02-10
      • 2023-03-26
      • 1970-01-01
      • 2012-02-17
      相关资源
      最近更新 更多