Qt代码实现创建控件和布局并实现自定义类的封装和调用

最基础的代码实现过程,先看效果图
在这里插入图片描述代码如下:

 QWidget *pNew=new  QWidget();
    pNew->setWindowTitle("新建");
    //设置整体大小
    pNew->resize(320,200);
    pNew->setMaximumWidth(330);
    pNew->setMaximumHeight(210);
    //创建三组控件,label的文字右对齐,固定LineEdit的大小
    QLabel *lableName=new QLabel("组名称:");
    lableName->setAlignment(Qt::AlignRight);
    QLineEdit *editName=new  QLineEdit();
    editName->setFixedSize(220,23);

    QLabel *lableERP=new QLabel("ERP代码:");
    lableERP->setAlignment(Qt::AlignRight);
    QLineEdit *editERP=new  QLineEdit();
    editERP->setFixedSize(220,23);

    QLabel *lableDescribe=new QLabel("描述信息:");
    lableDescribe->setAlignment(Qt::AlignRight);
    QLineEdit *editDescribe=new  QLineEdit();
    editDescribe->setFixedSize(220,23);

    //每组控件水平布局
    QHBoxLayout * Layout1= new QHBoxLayout();
    Layout1->addWidget(lableName);
    Layout1->addWidget(editName);

    QHBoxLayout * Layout2= new QHBoxLayout();
    Layout2->addWidget(lableERP);
    Layout2->addWidget(editERP);

    QHBoxLayout * Layout3= new QHBoxLayout();
    Layout3->addWidget(lableDescribe);
    Layout3->addWidget(editDescribe);


    //然后将水平布局后的vLayout垂直布局后放入GroupBox中
    QVBoxLayout * vLayout = new QVBoxLayout();
    vLayout->addLayout(Layout1);
    vLayout->addLayout(Layout2);
    vLayout->addLayout(Layout3);

    QGroupBox * group=new QGroupBox();
    group->setLayout(vLayout);

    //创建两个PushButton并水平布局,这里加入了弹簧填空
    QPushButton *btnSave=new QPushButton("保存");
    btnSave->setMaximumHeight(30);
    QPushButton *btnCancel=new QPushButton("取消");
    btnCancel->setMaximumHeight(30);
    QHBoxLayout * Layout4= new QHBoxLayout();
    Layout4->addSpacing(20);
    Layout4->addWidget(btnSave);
    Layout4->addSpacing(20);
    Layout4->addWidget(btnCancel);
    Layout4->addSpacing(20);

    //将groupbox和Layout4水平布局
    QVBoxLayout * mainLayout = new QVBoxLayout();
    mainLayout->addWidget(group);
    mainLayout->addSpacing(10);
    mainLayout->addLayout(Layout4);


    pNew->setLayout(mainLayout);
    pNew->show();

实际的项目中最好对上述的代码做一个封装,下面将上述的代码封装为一个自定义的Widget类,
通过信号槽和lambda表达式实现保存取消按钮功能;
保存按钮按下后如果填入的信息不为空则发送signal;
为外部调用者提供getMessage接口获取返回值;

//自定义控件类
class NewWidget:public QWidget
{
    Q_OBJECT
signals:
    void saveSignal();
private:
    QString m_Name;
    QString m_ERP;
    QString m_Describe;
public:
    explicit NewWidget(QWidget *parent=nullptr )
    {

        setWindowTitle("新建");
        //设置整体大小
        resize(320,200);
        setMaximumWidth(330);
        setMaximumHeight(210);
        //创建三组控件,label的文字右对齐,固定LineEdit的大小
        QLabel *lableName=new QLabel("组名称:",this);
        lableName->setAlignment(Qt::AlignRight);
        QLineEdit *editName=new  QLineEdit(this);
        editName->setFixedSize(220,23);

        QLabel *lableERP=new QLabel("ERP代码:",this);
        lableERP->setAlignment(Qt::AlignRight);
        QLineEdit *editERP=new  QLineEdit(this);
        editERP->setFixedSize(220,23);

        QLabel *lableDescribe=new QLabel("描述信息:",this);
        lableDescribe->setAlignment(Qt::AlignRight);
        QLineEdit *editDescribe=new  QLineEdit(this);
        editDescribe->setFixedSize(220,23);

        //每组控件水平布局
        QHBoxLayout * Layout1= new QHBoxLayout();
        Layout1->addWidget(lableName);
        Layout1->addWidget(editName);

        QHBoxLayout * Layout2= new QHBoxLayout();
        Layout2->addWidget(lableERP);
        Layout2->addWidget(editERP);

        QHBoxLayout * Layout3= new QHBoxLayout();
        Layout3->addWidget(lableDescribe);
        Layout3->addWidget(editDescribe);


        //然后将水平布局后的vLayout垂直布局后放入GroupBox中
        QVBoxLayout * vLayout = new QVBoxLayout();
        vLayout->addLayout(Layout1);
        vLayout->addLayout(Layout2);
        vLayout->addLayout(Layout3);

        QGroupBox * group=new QGroupBox();
        group->setLayout(vLayout);

        //创建两个PushButton并水平布局,这里加入了弹簧填空
        QPushButton *btnSave=new QPushButton("保存");
        connect(btnSave,&QPushButton::clicked,this,[=](){
            if(editName->text()=="")
            {
                QMessageBox::warning(this,"warning","名称不能为空!");
                return;

            }
            m_Name=editName->text();
            m_ERP=editERP->text();
            m_Describe=editDescribe->text();
            emit saveSignal();
            hide();
        });
        btnSave->setMaximumHeight(30);
        QPushButton *btnCancel=new QPushButton("取消");
        connect(btnCancel,&QPushButton::clicked,this,[this](){ this->hide();});
        btnCancel->setMaximumHeight(30);
        QHBoxLayout * Layout4= new QHBoxLayout();
        Layout4->addSpacing(20);
        Layout4->addWidget(btnSave);
        Layout4->addSpacing(20);
        Layout4->addWidget(btnCancel);
        Layout4->addSpacing(20);

        //将groupbox和Layout4水平布局
        QVBoxLayout * mainLayout = new QVBoxLayout();
        mainLayout->addWidget(group);
        mainLayout->addSpacing(10);
        mainLayout->addLayout(Layout4);

        this->setLayout(mainLayout);
    }

    void getMessage(QString &name,QString &ERP,QString &describe)
    {
        name=m_Name;
        ERP=m_ERP;
        describe=m_Describe;
    }
};

下面是怎样使用这个类:

   void MainWindow::deal_actionNew_triggered(bool checked)
{
  //创建自定义类的对象
    if(pNewWidget)
    {
        delete  pNewWidget;
        pNewWidget=nullptr;
    }
    pNewWidget=new  NewWidget();
    //保存时的信号槽
    connect(pNewWidget,&NewWidget::saveSignal,this,&MainWindow::deal_saveSignal);
    pNewWidget->show();

}
//响应保存信号槽函数
void MainWindow::deal_saveSignal()
{
    QString name;QString ERP;QString describe;
    pNewWidget->getMessage(name,ERP,describe);
    qDebug()<<"name="<<name;
    qDebug()<<"ERP="<<ERP;
    qDebug()<<"describe="<<describe;
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值