Qt5 - QBoxLayout 将所有东西堆叠在一起

Qt5 - QBoxLayout Piling Everything on Top of Each Other

我正在尝试学习 Qt,但在理解布局方面遇到了困难。无论我做什么,它只是把所有东西都堆在一起,而不是真正地布置任何东西。

这只是为了整理一些东西让我开始使用格式,但我要追求的是 - 三个小部件,它们是图层字段上方和下方的按钮,以及这三个小部件下方是两个输入和输出文本编辑字段。

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    setWindowTitle(config::kDisplay_name);

    input_field_ = new QTextEdit(this);
    input_field_->setPlaceholderText("Input");
    input_field_->setMinimumSize(this->width(), 200);

    output_field_ = new QTextEdit(this);
    output_field_->setPlaceholderText("Output");
    output_field_->setReadOnly(true);
    output_field_->setMinimumSize(this->width(), 200);

    connect(input_field_, &QTextEdit::textChanged,
            this, &MainWindow::UpdateOutputText);

    rotorR_ = new RotorSlot(this);
    rotorC_ = new RotorSlot(this);
    rotorL_ = new RotorSlot(this);

    rotor_layout_ = new QHBoxLayout();
    rotor_layout_->addWidget(rotorR_);
    rotor_layout_->addWidget(rotorC_);
    rotor_layout_->addWidget(rotorL_);

    layout_ = new QVBoxLayout();
    layout_->addLayout(rotor_layout_);
    layout_->addWidget(input_field_);
    layout_->addWidget(output_field_);
    
}
RotorSlot::RotorSlot(QWidget *parent)
    : QWidget(parent) {

    window_ = new QLabel(this);
    window_->setFont(QFont("Courier", 24, 75));
    window_->setText("A");
    window_->setAlignment(Qt::AlignCenter);
    window_->setFixedSize(50, 50);

    up_ = new QPushButton("^", this);
    up_->setFixedSize(50, 50);
    down_ = new QPushButton("v", this);
    down_->setFixedSize(50, 50);

    layout_ = new QVBoxLayout();
    layout_->addWidget(up_);
    layout_->addWidget(window_);
    layout_->addWidget(down_);
}

No matter what I do, I get this.

如果我将 setLayout(layout_); 添加到我的 MainWindow 构造函数中,我只会收到有关如何分配布局的错误消息。

我写的都和Qt文档中的例子一致,所以我错过了什么?怎么回事?

将布局分配给小部件的最简单方法是在布局的构造函数中传递小部件:

RotorSlot::RotorSlot(QWidget *parent) {
  // Set up widgets [...]
  
  // layout_ should lay out this widget
  layout_ = new QVBoxLayout(this);

  // Add things to layout [...]
}

但是,QMainWindow 有点特殊。它有一个内置的默认布局,可以处理菜单、状态栏、泊坞窗等。在这种情况下,您可以创建一个虚拟小部件并将其设置为 window 的中央小部件:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {

   // Set everything up [...]

   // Dummy widget
   QWidget *w = new QWidget(this);
   // Layout
   layout_ = new QVBoxLayout(w);
   // Set as central widget
   this->setCentralWidget(w);

   // Add things to layout [...]
}