Qt 共提供了 5 种布局管理器,每个布局管理器对应一个类,即 QVBoxLayout(垂直布局),QHBoxLayout(水平布局),QGridLayout(网格布局),QFormLayout和 QStackedLayout(分组布局) 常用的布局是前三种
QVBoxLayout* pLayout = new QVBoxLayout()///水平布局 QPushButton* p1 = new QPushButton("p1"); QPushButton* p2 = new QPushButton("p2"); QPushButton* p3 = new QPushButton("p3"); QPushButton* p4 = new QPushButton("p4"); pLayout->addWidget(p1); pLayout->addWidget(p2); pLayout->addWidget(p3); pLayout->addWidget(p4); this->setLayout(pLayout);
QHBoxLayout* pLayout = new QHBoxLayout()///水平布局 QPushButton* p1 = new QPushButton("p1"); QPushButton* p2 = new QPushButton("p2"); QPushButton* p3 = new QPushButton("p3"); QPushButton* p4 = new QPushButton("p4"); pLayout->addWidget(p1); pLayout->addWidget(p2); pLayout->addWidget(p3); pLayout->addWidget(p4); this->setLayout(pLayout);
QGridLayout* layout = new QGridLayout(); TestBtn1.setText("Test Button 1"); TestBtn1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);///设置组件尺寸可扩展 TestBtn1.setMinimumSize(160, 30);//设置最小尺寸 TestBtn2.setText("Test Button 2"); TestBtn2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); TestBtn2.setMinimumSize(160, 30); TestBtn3.setText("Test Button 3"); TestBtn3.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); TestBtn3.setMinimumSize(160, 30); TestBtn4.setText("Test Button 4"); TestBtn4.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); TestBtn4.setMinimumSize(160, 30); layout->setSpacing(10)//设置间距 layout->addWidget(&TestBtn1, 0, 0);///向网格的不同坐标添加不同的组件 layout->addWidget(&TestBtn2, 0, 1); layout->addWidget(&TestBtn3, 1, 0); layout->addWidget(&TestBtn4, 1, 1); layout->setRowStretch(0, 1)//设置行列比例系数 layout->setRowStretch(1, 3); layout->setColumnStretch(0, 1); layout->setColumnStretch(1, 3); setLayout(layout);//设置顶级布局管理器
QApplication a(argc, argv); //创建主窗口 QWidget widget; widget.setWindowTitle("QFormLayout表单布局"); //创建 4 个按钮和 1 个文本框 QFormLayout* layout = new QFormLayout(); 设置表中的标签位于控件上方 layout->setRowWrapPolicy(QFormLayout::WrapAllRows); //添加 3 行输入框和标签 layout->addRow("Name:",new QLineEdit()); layout->addRow("Email:",new QLineEdit()); layout->addRow("Adress:",new QLineEdit()); ///设置行间距和列间距 10 layout->setSpacing(10); //将 layout 表单添加到 widget 窗口中 widget.setLayout(layout); widget.show(); return a.exec();
QApplication a(argc, argv); //创建主窗口 QWidget widget; widget.setWindowTitle("QStackedLayout分组布局"); widget.resize(600,400); ///在主窗口加一个水平布局控制器 QHBoxLayout *layout=new QHBoxLayout; //创建列表 QListWidget listWidget(&widget); listWidget.setMinimumWidth(150); listWidget.setFont(QFont("宋体",14)); listWidget.addItem("QPushButton"); listWidget.addItem("QLabel"); listWidget.addItem("QLineEdit"); //新建 3 个窗口,文本框、按钮和单行输入框分别放置 QWidget widget1; widget1.setMinimumSize(400,400); QPushButton but1("这是一个按钮",&widget1); QWidget widget2; widget2.setMinimumSize(400,400); QLabel lab1("这是一个文本框",&widget2); QWidget widget3; widget3.setMinimumSize(400,400); QLineEdit edit("这是单行输入框",&widget3); //创建分组布局,将 3 将每个窗口添加到分组控件中 QStackedLayout *stackedLayout = new QStackedLayout; stackedLayout->addWidget(&widget1); stackedLayout->addWidget(&widget2); stackedLayout->addWidget(&widget3); //layout 第一列添加 QListWidget 控件,第二列添加分组布局控件,设置其伸缩系数比 1:4 layout->addWidget(&listWidget,1); layout->addLayout(stackedLayout,4); //将 layout 添加水平布局控件 widget 窗口中 widget.setLayout(layout); widget.show(); 当点击列表中的某一项时,//连接信号和槽,切换分组布局管理器显示的控件 QObject::connect(&listWidget,&QListWidget::currentRowChanged,stackedLayout,&QStackedLayout::setCurrentIndex); return a.exec();