QT-Layout

20 篇文章 0 订阅

QVBoxLayout不是一个Widget,目的是控件的大小和位置。

sizeHint()推荐尺寸,重载进行修改尺寸,返回Qsiye。或者通过函数setMinimumSize和setMaximumSize进行设置最大最小值。

QSizePolicy::PolicyFlag

        GrowFlag

        ExpandFlag

        ShrinkFlag

        IgnoreFlag

拼接之后有:

四种Layout

 ui_myqt1.h

/********************************************************************************
** Form generated from reading UI file 'myqt1.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_MYQT1_H
#define UI_MYQT1_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_myqt1Class
{
public:
    QWidget *verticalLayoutWidget;
    QVBoxLayout *verticalLayout;
    QPushButton *pushButton_2;
    QPushButton *pushButton;
    QPushButton *pushButton_3;

    void setupUi(QWidget *myqt1Class)
    {
        if (myqt1Class->objectName().isEmpty())
            myqt1Class->setObjectName(QString::fromUtf8("myqt1Class"));
        myqt1Class->resize(836, 517);
        verticalLayoutWidget = new QWidget(myqt1Class);
        verticalLayoutWidget->setObjectName(QString::fromUtf8("verticalLayoutWidget"));
        verticalLayoutWidget->setGeometry(QRect(20, 20, 191, 141));
        verticalLayout = new QVBoxLayout(verticalLayoutWidget);
        verticalLayout->setSpacing(6);
        verticalLayout->setContentsMargins(11, 11, 11, 11);
        verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
        verticalLayout->setContentsMargins(0, 0, 0, 0);
        pushButton_2 = new QPushButton(verticalLayoutWidget);
        pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));

        verticalLayout->addWidget(pushButton_2);

        pushButton = new QPushButton(verticalLayoutWidget);
        pushButton->setObjectName(QString::fromUtf8("pushButton"));

        verticalLayout->addWidget(pushButton);

        pushButton_3 = new QPushButton(verticalLayoutWidget);
        pushButton_3->setObjectName(QString::fromUtf8("pushButton_3"));

        verticalLayout->addWidget(pushButton_3);


        retranslateUi(myqt1Class);

        QMetaObject::connectSlotsByName(myqt1Class);
    } // setupUi

    void retranslateUi(QWidget *myqt1Class)
    {
        myqt1Class->setWindowTitle(QCoreApplication::translate("myqt1Class", "myqt1", nullptr));
        pushButton_2->setText(QCoreApplication::translate("myqt1Class", "PushButton", nullptr));
        pushButton->setText(QCoreApplication::translate("myqt1Class", "PushButton", nullptr));
        pushButton_3->setText(QCoreApplication::translate("myqt1Class", "PushButton", nullptr));
    } // retranslateUi

};

namespace Ui {
    class myqt1Class: public Ui_myqt1Class {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MYQT1_H

 控件设置,垂直和水平布局

//#include "myqt2.h"
#include <QtWidgets/QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    /*myqt2 w;
    w.show();*/
    QWidget* win = new QWidget();
    win->resize(400, 400);

    //垂直布局,构造函数传递widget
    //QVBoxLayout* lay = new QVBoxLayout();
    //垂直布局
    QHBoxLayout* lay = new QHBoxLayout();
    win->setLayout(lay);

    QPushButton* but1 = new QPushButton("button1");
    lay->addWidget(but1);
    
    //水平 垂直 fixed使用推荐大小
    but1->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
    //尽量拉伸,最小是推荐值
    but1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    //尽量拉伸,没有最小值限制
    but1->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);

    //设置控件的最小值
    but1->setMinimumSize(100,50);
    //设置空间最大值
    but1->setMaximumSize(500,100);
    QPushButton* but2 = new QPushButton("button2");
    lay->addWidget(but2);

    QPushButton* but3 = new QPushButton("button3");
    lay->addWidget(but3);


    lay->setContentsMargins(0,0,0,0);   //设置边缘距离
    lay->setSpacing(5); //设置控件间距

    win->show();

    qDebug() << but1->sizeHint().width() << ";" << but1->sizeHint().height();   //显示推荐值大小
    qDebug() << but1->width() << ";" << but1->height(); //显示实际的大小
    return a.exec();
}

表格布局

#include "myqt3.h"
#include <QtWidgets/QApplication>
#include <QGridLayout>
#include <QPushButton>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    /*myqt3 w;
    w.show();*/
    QWidget* win = new QWidget();
    win->resize(300,300);
    QGridLayout* g1 = new QGridLayout(win);
    QPushButton* but11 = new QPushButton("but11");
    g1->addWidget(but11,0,0);
    QPushButton* but12 = new QPushButton("but12");
    but12->setMinimumSize(100, 100);
    but12->setMaximumSize(500, 500);
    but12->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

    g1->addWidget(but12,0,1);
    QPushButton* but13 = new QPushButton("but13");
    g1->addWidget(but13,0,2);
    QPushButton* but21 = new QPushButton("but21");
    g1->addWidget(but21,1,0);
    QPushButton* but22 = new QPushButton("but22");
    g1->addWidget(but22, 1, 1);
    QPushButton* but23 = new QPushButton("but23");
    g1->addWidget(but23, 1, 2);

    win->show();

    return a.exec();
}

表单布局

#include "myqt3.h"
#include <QFormLayout>
#include <QPushButton>
#include <QlineEdit>
#include <QLabel>

myqt3::myqt3(QWidget* parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    QFormLayout* lay = new QFormLayout(this);
    QLineEdit* name = new QLineEdit();
    lay->addRow("&Name", name);
    QLineEdit* email = new QLineEdit();
    lay->addRow("&Email", email);

    QLineEdit* age = new QLineEdit();
    //添加age到第一个位置
    lay->insertRow(1, "&Age", age);

    QLabel* info = new QLabel();
    info->setText("input");
    //设置样式表
    info->setStyleSheet("color:red;");
    lay->insertRow(0, "", info);

    //添加Save 和Clear按钮
    QPushButton* save = new QPushButton("Save");
    QPushButton* clear = new QPushButton("Clear");
    //添加一个平行布局
    QHBoxLayout* hlay = new QHBoxLayout();
    hlay->addWidget(save);
    hlay->addWidget(clear);

    lay->addRow(hlay);


    QObject::connect(save, SIGNAL(clicked()), this, SLOT(Save()));
    QObject::connect(clear, SIGNAL(clicked()), this, SLOT(Clear()));
}
void myqt3::Save()
{
    //找到layout
    QFormLayout* lay = (QFormLayout*)this->layout();   //强制转换layout为QFormLayout
    QLabel* label = (QLabel*)lay->itemAt(0, QFormLayout::FieldRole)->widget();
    //存放错误信息
    QString error = "";
    //遍历所有QLineEdit
    //遍历所有FormLayout的所有元素
    for (int i = 0; i < lay->rowCount(); i++)
    {
        QLayoutItem* item = lay->itemAt(i, QFormLayout::FieldRole); //获取输入框,可能是QLineEidt,也可能是按键
        QLineEdit* e = (QLineEdit*)item->widget();      //将所有widget转化为QLineEidt
        if (!e) //转换成功非空,否则转换成功
            continue;

        QLayoutItem* layItem = lay->itemAt(i, QFormLayout::LabelRole);
        if (!layItem) continue;
        QLabel* titleLabel = (QLabel*)layItem->widget();
        if (!titleLabel) continue;
        QString title = titleLabel->text();

        //如果转换成功
        QString cname = e->metaObject()->className();   //获取输入框的名字
        if (cname == "QLineEdit")
        {
            if (e->text().trimmed() == "")
            {
                e->setFocus();  //设置光标,移动到此
                error += title;
                error += " is empty!\n";
            }
        }
    }
    label->setText(error);
}
void myqt3::Clear()
{
    //找到layout
    QFormLayout *lay = (QFormLayout *)this->layout();   //强制转换layout为QFormLayout
    //遍历所有QLineEdit
    //遍历所有FormLayout的所有元素
    for (int i = 0; i < lay->rowCount(); i++)
    {
        QLayoutItem* item = lay->itemAt(i, QFormLayout::FieldRole); //获取输入框,可能是QLineEidt,也可能是按键
        QLineEdit* e = (QLineEdit*)item->widget();      //将所有widget转化为QLineEidt
        if (!e) //转换成功非空,否则转换成功
            continue;
        //如果转换成功
        QString cname = e->metaObject()->className();   //获取输入框的名字
        if (cname == "QLineEdit")
        {
            e->setText(""); //清空输入框
        }
    }

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值