Qt使用代码进行窗口布局-信号槽

准备

1,直接连接下载工程

2,或者按如下步骤操作。建立工程

第1步:建立页面工程,项目名称为“Example”,基类为“QDialog”,类名为Contant,取消创建界面复选框的选中状态。

第2步:建立修改用户基本信息类,基类为QWidget

(1)baseinfo.h

#ifndef BASEINFO_H
#define BASEINFO_H
 
#include <QWidget>
#include<QLabel>        //标签
#include<QLineEdit>
#include<QComboBox>     //下拉列表框,item,,列表项
#include<QTextEdit>     //多行文本框控件
#include<QGridLayout>   //网格布局
#include <QPushButton>  //按钮
class BaseInfo : public QWidget
{
    Q_OBJECT
public:
    explicit BaseInfo(QWidget *parent = nullptr);
 
signals:
 
private:
    //左侧
    QLabel *UsernameLabel;      //用户名
    QLabel *NameLabel;          //姓名
    QLabel *SexLabel;           //性别
    QLabel *DepartmentLabel;    //部门
    QLabel *AgeLabel;           //年龄
    QLabel *OtherLabel;         //其它
    QLineEdit *UserNameLineEdit;    //用户名编辑框
    QLineEdit *NameLineEdit;    //姓名编辑框
    QComboBox *SexComboBox;     //性别组合框
    QTextEdit *DepartmentTextEdit;  //部门文本框
    QLineEdit *AgeLineEdit;     //年龄编辑框
    QGridLayout *LeftLayout;    //网格布局
    //右侧
    QLabel *Headlabel;           //左上角
    QLabel *HeadIconLabel;
    QPushButton *UpdateHeadBtn; //更新按钮
    QHBoxLayout *TopRightLayout;    //水平布局
    QLabel *IntroductionLabel;      //个人说明
    QTextEdit *IntroductionTextEdit;    //个人说明文本框
    QVBoxLayout *RightLayout;   //垂直布局

};
 
#endif // BASEINFO_H

(2)baseinfo.cpp

#include "baseinfo.h"
 
BaseInfo::BaseInfo(QWidget *parent) : QWidget(parent)
{
    //---------左侧----------
    UsernameLabel = new QLabel(tr("用户名:"));     //建立用户名对象
    UserNameLineEdit = new QLineEdit;           //用户名编辑对象
 
    NameLabel = new QLabel("姓名:");
    NameLineEdit = new QLineEdit;           //姓名编辑对象
 
    SexLabel = new QLabel(tr("性别:"));
    SexComboBox = new QComboBox;
    SexComboBox->addItem(tr("女"));
    SexComboBox->addItem(tr("男"));
 
    DepartmentLabel = new QLabel(tr("部门"));
    DepartmentTextEdit = new QTextEdit;
 
    AgeLabel = new QLabel(tr("年龄"));
    AgeLineEdit = new QLineEdit;
 
    OtherLabel = new QLabel(tr("备注"));
    OtherLabel->setFrameStyle(QFrame::Panel||QFrame::Sunken);
 
    LeftLayout = new QGridLayout();     //网格布局
    LeftLayout->addWidget(UsernameLabel,0,0);       //加入用户名,第1行
    LeftLayout->addWidget(UserNameLineEdit,0,1);       //加入用户名
 
    LeftLayout->addWidget(NameLabel,1,0);       //加入姓名,第2行
    LeftLayout->addWidget(NameLineEdit,1,1);       //加入姓名
 
    LeftLayout->addWidget(SexLabel,2,0);       //加入性别,第3行
    LeftLayout->addWidget(SexComboBox,2,1);       //加入性别
 
    LeftLayout->addWidget(DepartmentLabel,3,0);       //加入部门,第4行
    LeftLayout->addWidget(DepartmentTextEdit,3,1);       //加入部门
 
    LeftLayout->addWidget(AgeLabel,4,0);       //加入年龄,第5行
    LeftLayout->addWidget(AgeLineEdit,4,1);       //加入年龄
 
    LeftLayout->addWidget(OtherLabel,5,0,1,2);       //加入备注,第6行,从(5,0)开始占据1行2列
 
   //---------右侧----------
    Headlabel = new QLabel(tr("头像"));   //右上角部分
    HeadIconLabel = new QLabel;          //标签
    QPixmap icon("312.png");
    HeadIconLabel->setPixmap(icon);
    HeadIconLabel->resize(icon.width(),icon.height());
    UpdateHeadBtn = new QPushButton(tr("更新"));      //更新按钮
    TopRightLayout = new QHBoxLayout();         //水平布局
    TopRightLayout->setSpacing(100);//这个设置了该水平布局控件内子控件的间隔距离 即下面三个控件之间的距离
    TopRightLayout->addWidget(Headlabel);
    TopRightLayout->addWidget(HeadIconLabel);
    TopRightLayout->addWidget(UpdateHeadBtn);
 
    IntroductionLabel = new QLabel(tr("个人说明:"));    //右下角部分
    IntroductionTextEdit = new QTextEdit;
    RightLayout = new QVBoxLayout;      //垂直布局
    RightLayout->setSpacing(10);
    RightLayout->addLayout(TopRightLayout);     //加入上面的布局
    RightLayout->addWidget(IntroductionLabel);
    RightLayout->addWidget(IntroductionTextEdit);
    //---------主窗口----------
    QGridLayout *mainLayout = new QGridLayout(this);    //父类是this
    mainLayout->setMargin(15);
    mainLayout->setSpacing(10);
    mainLayout->addLayout(LeftLayout,0,0);      //主窗口中加入左边窗口
    mainLayout->addLayout(RightLayout,0,1);      //主窗口中加入右边窗口
 
}

content.h

#ifndef CONTENT_H
#define CONTENT_H
 
#include <QDialog>
#include <QStackedWidget>   //堆栈窗体
#include <QPushButton>  //按钮
#include "baseinfo.h"
 
 
class Content : public QFrame
{
    Q_OBJECT
 
public:
    Content(QWidget *parent = nullptr);
    ~Content();
    QStackedWidget *stack;      //堆栈窗口
    QPushButton *AmendBtn;      //修改按钮
    QPushButton *CloseBtn;      //关闭按钮
    BaseInfo *baseInfo;         //信息页面
 
 
 
 
};
#endif // CONTENT_H

content.cpp

#include "content.h"
 
Content::Content(QWidget *parent)
    : QFrame(parent)
{
    //在构造函数中生成空间
    //对堆栈窗口的显示风格进行设置
    stack = new QStackedWidget(this);
    stack->setFrameStyle(QFrame::Panel|QFrame::Sunken);
    //-------插入页面------
    baseInfo = new BaseInfo();      //生成页面对象
 
    stack->addWidget(baseInfo);     //将基本信息页面加入到堆栈窗口中
 
    //-------创建两个按钮-------
    AmendBtn = new QPushButton(tr("修改"));
    CloseBtn = new QPushButton(tr("关闭"));
 
    QHBoxLayout *BtnLayout = new QHBoxLayout;   //水平布局
    BtnLayout->addStretch(1);
    BtnLayout->addWidget(AmendBtn); //加入修改按钮
    BtnLayout->addWidget(CloseBtn); //加入关闭按钮
 
    //-------进行整体布局
    QVBoxLayout *RightLayout = new QVBoxLayout(this);   //加上右边窗口
    RightLayout->setMargin(10);
    RightLayout->setSpacing(6);
    RightLayout->addWidget(stack);
    RightLayout->addLayout(BtnLayout);
 
}
 
Content::~Content()
{
}
 

main.cpp

#include "content.h"
 
#include <QApplication>
#include <QTextCodec>
#include <QSplitter>        //分隔器
#include <QListWidget>      //列表
#include <QFont>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFont font("AR PL KaitiM  GB",12);      //设置整个程序采用的字体与字号
    QTextCodec::codecForName("gbk");
    a.setFont(font);
    //新建一个水平分割窗口,作为主布局框
    QSplitter *splitterMain = new QSplitter(Qt::Horizontal, 0);
    splitterMain->setOpaqueResize(true);
    QListWidget *list = new QListWidget(splitterMain);  //条目选择框
    list->insertItem(0,QObject::tr("baseinfo"));
    list->insertItem(1,QObject::tr("communication"));
    list->insertItem(2,QObject::tr("detailOfFile"));
    Content *content = new Content(splitterMain);   //创建窗口,父窗口为splitterMain
    QObject::connect(list,SIGNAL(currentRowChanged(int)),content->stack, SLOT(setCurrentIndex(int)));
                    //连接列表框和堆栈窗口
    //设置主布局框,即水平分割窗口的标题
    splitterMain->setWindowTitle(QObject::tr("editUsrFile"));
    //设置主布局框,即水平分割窗口的最小尺寸
    splitterMain->setMinimumSize(splitterMain->minimumSize());
    //设置主布局框,即水平分割窗口的最大尺寸
    splitterMain->setMaximumSize(splitterMain->maximumSize());
 
    splitterMain->show();
    //Content w;
    //w.show();
    return a.exec();
}

解析

代码整体布局框架示意图。

信号槽

新建了一个自定义的槽函数

 从图中可以看到,connect的槽函数的对象是content,槽函数定义时其域是content,这两个要对应。

 如果两者不对应,如下,

将content下的AmendBtn作为connect接收对象,运行后提示找不到QPushButton::GetSotoShow(int),,因为声明的GetSotoShow函数不在QPushButton域下。

试了一下失败了,没有成功将GetSotoShow函数放在QPushButton域下,报错了,有懂得小伙伴指点下

另尝试将信息传递到baseinfo下  22.7.8

main.cpp 信号槽的连接

 其中连接的对象是content->baseInfo 

名称在content.h中

baseinfo.h

 baseinfo.cpp

 效果图;

疑问

下图第一句中stack有什么作用?第一句又在做什么呢?

将第二行baseinfo换成stack后 ChangeName函数是无法响应的。

 查看代码可知stack是一个存放控件的堆,那理论上baseinfo应该在stack内?

建立这个stack又有什么作用呢?

 通过去掉stack后运行调试,程序挂了,原因有待进一步分析。一个可能的问题是stack将baseinfo作为了一个整体。

 

备注

如若注释和中文为乱码

法1.把文件保存为utf8无boom格式。【推荐】

法2.下述方法只能当次有效,下次需要从新设置

如若注释为乱码,修改文件编码为GB2312,,qt显示出的界面仍然为乱码,还没发现怎么解决

关于图片没显示,请将对应图片放到生成的debug文件夹下

原文link:

QT:使用代码进行窗口布局_沪上花开的博客-CSDN博客_qt怎么用代码布局界面

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心超人dev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值