QPushButton不尊重横向扩展规模政策

时间:2014-08-26 18:22:55

标签: c++ linux qt qt5

我正在尝试将几个QPushButton实体放在QVBoxLayout中,使它们居中并扩展。扩展标签工作正常,直到我告诉QVBoxLayout使用AlignHCenter,之后QPushButton全部跳到最小尺寸并保持不变。我做错了什么?

QVBoxLayout *vBoxLayout = new QVBoxLayout(this);
setLayout(vBoxLayout);

//Create title and add to layout
QLabel *titleLabel = new QLabel(this);
titleLabel->setText(menuTitle);
titleLabel->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
titleLabel->setMaximumHeight(35);
titleLabel->setStyleSheet(QString("QLabel { font-size: 16pt; }"));
vBoxLayout->addWidget(titleLabel);
vBoxLayout->setStretchFactor(titleLabel, 1);


//Create buttons and add to layout
QMap<int, QString>::const_iterator it;
for (it = m_buttonMapping.cbegin(); it != m_buttonMapping.cend(); ++it)
{
    QPushButton *button = new QPushButton(it.value(), this);
    connect(button, SIGNAL(clicked()), sigMapper, SLOT(map()));
    sigMapper->setMapping(button, it.key());

    button->setMinimumHeight(40);
    button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    button->setMaximumWidth(800);
    button->setMinimumWidth(300);

    vBoxLayout->addWidget(button);
    vBoxLayout->setAlignment(button, Qt::AlignHCenter);  //<-- without this, expanding works fine!
    vBoxLayout->setStretchFactor(button, 1);
}

vBoxLayout->setContentsMargins(10, 0, 10, 0);

1 个答案:

答案 0 :(得分:3)

通过在布局上指定对齐方式,可以使QPushButtons无法展开。可用的新空间将用于使QPushButtons保持居中,而不是允许它们调整大小并使其周围的空间用于居中。拉伸因子满足您对布局内容的比例调整和居中的要求。

要解决此问题,请创建包装窗口小部件和布局(或仅布局),并将应用了拉伸因子的vBoxLayout布局的窗口小部件添加到包装器布局中。在添加窗口小部件之前和之后,您将使用QHBoxLayout :: addStretch将QSpacerItems添加到包装器布局中。然后,您可以调整窗口小部件和间隔器的拉伸系数,以获得所需的效果。

以下是一些可以解决问题的示例代码:

<强> MainWindow.cpp

#include "MainWindow.hpp"
#include <QPushButton>
#include <QLabel>
#include <QBoxLayout>

MainWindow::MainWindow(QWidget* parent)
  : QMainWindow(parent) {
  QWidget* centralWidget = new QWidget(this);

  QVBoxLayout* layout = new QVBoxLayout(centralWidget);

  // Create a wrapper widget that will align horizontally
  QWidget* alignHorizontalWrapper = new QWidget(centralWidget);
  layout->addWidget(alignHorizontalWrapper);

  // Layout for wrapper widget
  QHBoxLayout* wrapperLayout = new QHBoxLayout(alignHorizontalWrapper);
  // Set its contents margins to 0 so it won't interfere with your layout
  wrapperLayout->setContentsMargins(0, 0, 0, 0);

  wrapperLayout->addStretch(1);

  QWidget* widget = new QWidget(alignHorizontalWrapper);
  wrapperLayout->addWidget(widget, 3);

  wrapperLayout->addStretch(1);

  QVBoxLayout* vBoxLayout = new QVBoxLayout(widget);

  QLabel* titleLabel = new QLabel(this);
  titleLabel->setText(QStringLiteral("Menu"));
  titleLabel->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
  titleLabel->setMaximumHeight(35);
  titleLabel->setStyleSheet(QStringLiteral("QLabel { font-size: 16pt; }"));
  vBoxLayout->addWidget(titleLabel);
  vBoxLayout->setStretchFactor(titleLabel, 1);

  for (int i = 0; i < 3; ++i) {
    const QString& value = QStringLiteral("Button ") + QString::number(i);

    QPushButton* button = new QPushButton(value, this);

    button->setMinimumHeight(40);
    button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    //button->setMaximumWidth(800);
    button->setMinimumWidth(300);

    vBoxLayout->addWidget(button);
    //vBoxLayout->setAlignment(button, Qt::AlignHCenter);  // without this, expanding works fine!
    vBoxLayout->setStretchFactor(button, 3);
  }

  vBoxLayout->setContentsMargins(10, 0, 10, 0);

  this->setCentralWidget(centralWidget);
}

<强> MainWindow.hpp

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QMainWindow>

class MainWindow : public QMainWindow {
  Q_OBJECT

 public:
  explicit MainWindow(QWidget* parent = nullptr);
};

#endif // MAINWINDOW_HPP

<强>的main.cpp

#include "MainWindow.hpp"
#include <QApplication>

int main(int argc, char* argv[]) {
  QApplication app(argc, argv);

  MainWindow window;
  window.show();

  return app.exec();
}