最基础的代码实现过程,先看效果图
代码如下:
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;
}