Saya mencoba belajar tentang Qt dan saya kesulitan memahami tata letak. Tidak peduli apa yang saya lakukan, itu hanya menumpuk semuanya di atas satu sama lain dan tidak benar-benar meletakkan apa pun.

Ini hanya untuk mengumpulkan sesuatu agar saya dapat menjalankan format, tetapi yang saya kejar adalah ini - Tiga widget yang merupakan tombol di atas dan di bawah bidang lapisan, dan di bawah ketiga widget ini ada dua input dan output bidang edit teks.

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

Tidak peduli apa yang saya lakukan, saya mendapatkan ini.

Jika saya menambahkan setLayout(layout_); ke konstruktor MainWindow saya, saya hanya mendapatkan kesalahan tentang bagaimana sudah ada tata letak yang ditetapkan.

Apa yang saya tulis semuanya tampaknya konsisten dengan contoh dalam dokumentasi Qt, jadi apa yang saya lewatkan? Apa yang sedang terjadi?

0
jackmill 12 Mei 2021, 12:22

1 menjawab

Jawaban Terbaik

Cara termudah untuk menetapkan tata letak ke widget adalah dengan meneruskan widget di konstruktor tata letak:

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

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

Namun, QMainWindow adalah kasus khusus. Ini memiliki tata letak default bawaan, yang menangani menu, bilah status, buruh pelabuhan, dll. Dalam hal ini, Anda akan membuat widget dummy dan mengaturnya sebagai widget pusat jendela:

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 [...]
}
0
king_nak 12 Mei 2021, 09:31