QT ④ 布局&MainWindow

QT ④ 布局&MainWindow

一、布局管理

一个界面只能有一个布局

1. 水平布局(QHBoxLayout)

  • 特点:控件按水平方向从左到右排列。

  • 适用场景:需要横向排列的控件(如工具栏按钮、一行内的输入框和按钮)。

  • 示例

    QHBoxLayout *hLayout = new QHBoxLayout;
    hLayout->addWidget(button1); // 左侧
    hLayout->addWidget(button2); // 中间
    hLayout->addWidget(button3); // 右侧
    

2. 垂直布局(QVBoxLayout)

  • 特点:控件按垂直方向从上到下排列。

  • 适用场景:需要纵向排列的控件(如表单中的多行输入框、垂直排列的按钮组)。

  • 示例

    QVBoxLayout *vLayout = new QVBoxLayout;
    vLayout->addWidget(label1);  // 上方
    vLayout->addWidget(input1);  // 中间
    vLayout->addWidget(button);  // 下方
    

3. 网格布局(QGridLayout)

  • 特点:控件按行列网格形式排列,类似表格,可指定控件占据的行数和列数。

  • 适用场景:需要精确控制行列位置的布局(如计算器按钮、复杂表单)。

  • 示例

    QGridLayout *gridLayout = new QGridLayout;
    gridLayout->addWidget(btn1, 0, 0); // 第0行第0列
    gridLayout->addWidget(btn2, 0, 1); // 第0行第1列
    gridLayout->addWidget(btn3, 1, 0, 1, 2); // 第1行第0列,跨2列
    

共性与优势

  • 自动适应窗口大小变化,无需手动计算控件位置。
  • 可嵌套使用(如水平布局中包含垂直布局),构建复杂界面。
  • 通过 addStretch() 可添加伸缩项,控制控件间距和对齐方式。

二、主窗口 QMainWindow

主要布局区域

  1. 菜单栏(Menu Bar)
    • 位于窗口顶部,通过 menuBar() 获取,用于添加下拉菜单(QMenu)。
    • 示例:QMenu *fileMenu = menuBar()->addMenu("文件");
  2. 工具栏(Tool Bar)
    • 通常在菜单栏下方,可浮动或停靠,通过 addToolBar() 添加,用于放置常用工具按钮(QAction)。
    • 示例:QToolBar *toolBar = addToolBar("工具");
  3. 中央部件(Central Widget)
    • 窗口的核心区域,所有主要内容(如文本编辑、表格等)都放在这里,必须设置(否则窗口会空白)。
    • 示例:setCentralWidget(new QTextEdit);(将文本编辑框设为中央部件)
  4. 状态栏(Status Bar)
    • 位于窗口底部,通过 statusBar() 获取,用于显示临时状态信息或永久提示。
    • 示例:statusBar()->showMessage("就绪");
  5. dock 窗口(Dock Widget)
    • 可停靠在窗口边缘(上下左右)的浮动面板,通过 addDockWidget() 添加,用于放置辅助功能(如工具栏、属性面板)。
    • 示例:addDockWidget(Qt::RightDockWidgetArea, new QDockWidget("属性"));
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    resize(640,480);

    //menuBar() 获取默认的菜单栏    addMenu() 添加菜单,返回QMenu首地址
    QMenu *fileMenu = menuBar()->addMenu("文件");
    //QAction *act = menuBar()->addMenu(new QMenu("编辑"));
    QAction *newAct = new QAction("新建");
    newAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N));
    //newAct->setIcon(QIcon(""));
    newAct->setStatusTip("新建...");
    fileMenu->addAction(newAct);            //添加菜单项
    connect(newAct , &QAction::triggered , [&](){
        qDebug() << "新建";
    });


    QAction *openAct = fileMenu->addAction("打开");
    openAct->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_O));
    openAct->setStatusTip("打开...");
    connect(openAct , &QAction::triggered , this , &MainWindow::openFunc);

    QAction *saveAct = fileMenu->addAction("保存",QKeySequence(Qt::CTRL | Qt::Key_S),[&](){
        qDebug() << "保存";
    });
    saveAct->setStatusTip("保存...");
//============================================子菜单=================================

    fileMenu->addSeparator();   //添加分割线

    QMenu *subMenu = fileMenu->addMenu("最近打开的文件");
    subMenu->addAction("1.cpp");
    subMenu->addAction("2_main.cpp");

//===========================工具栏================================
    QToolBar *tool_1 = addToolBar("文件");
    tool_1->addAction(newAct);
    tool_1->addAction(openAct);
    tool_1->addAction(saveAct);
    tool_1->setMovable(false);  //设置工具栏不可移动
    //tool_1->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);  //设置工具栏可移动区域

    QToolBar *tool_2 = new QToolBar("工具");
    tool_2->setMovable(false);
    tool_2->addWidget(new QLabel("页码"));
    tool_2->addWidget(new QLineEdit);
    tool_2->addWidget(new QPushButton("跳转"));
    addToolBar(Qt::BottomToolBarArea,tool_2);

//===========================状态栏============================

    //显示状态栏  第二个参数 timeout = 0 表示一直显示 , timeout单位毫秒;
    //statusBar()->showMessage("记事本",5000);
     QStatusBar *sb = statusBar();
    QLabel *lb = new QLabel("1111");
    lb->setMinimumWidth(200);
    sb->addWidget(lb);
    sb->addWidget(new QLabel("xxxxxxxx"));
    QPushButton *btn = new QPushButton;
    QMenu *m = new QMenu;
    m->addAction(newAct);
    m->addAction(openAct);
    m->addAction(saveAct);
    btn->setMenu(m);

    sb->addWidget(btn);


//===================================工作区=====================================
    QListWidget *lw = new QListWidget;
    QStringList list = {"1_homework","2_QLayout","3_QMainWindow"};
    lw->addItems(list);

    QDockWidget *dw = new QDockWidget("项目");            //构造工作区
    dw->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);//设置允许区域
    dw->setMaximumWidth(100);
    dw->setWidget(lw);
    addDockWidget(Qt::LeftDockWidgetArea,dw);       //添加工作区到当前界面的某个区域

    QDockWidget *dw2 = new QDockWidget("工作区");            //构造工作区
    dw2->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);//设置允许区域
    dw2->setMaximumWidth(100);
    dw2->setWidget(new QCalendarWidget);        //设置日历
    addDockWidget(Qt::RightDockWidgetArea,dw2);

    this->tabifyDockWidget(dw,dw2);             //工作区堆叠

//==================================中央控件==================================

    //选项卡
    QTabWidget *tab = new QTabWidget;
    tab->addTab(new QTextEdit,"tab 1"); //添加选项卡
    tab->addTab(new QTextEdit,"tab 2");
    tab->insertTab(0,new QTextEdit,"insert tab");    //在0位置处插入一个选项卡
    tab->setTabsClosable(true);         //设置选项卡可关闭(功能需自己实现)
    this->setCentralWidget(tab);        //设置为中央控件


}

MainWindow::~MainWindow()
{

}

void MainWindow::openFunc()
{
    qDebug() << "打开";
}

运行截图:

alt

全部评论

相关推荐

03-27 16:40
已编辑
门头沟学院 C++
26学院本太难了,很多公司机筛就给我刷了。机会都难拿到如果是简历存在问题也欢迎拷打————————————————————分割线——————————————————————2026.3.4更新:发完贴之后,时不时投递又收到了不少的笔试/面试邀请。主要是之前投递简历出去之后基本上都是沉默状态,年后好转了不少timeline:2026.01.21&nbsp;文远知行笔试,半年多没刷算法题&nbsp;-&gt;挂&nbsp;(后续HR说春招可以重新安排笔试)2026.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小鹏汇天&nbsp;技术一面,第二周收到结果&nbsp;-&gt;挂2026.2.12&nbsp;&nbsp;&nbsp;大众Cariad代招&nbsp;技术二面&nbsp;-&gt;Offer2026.2.28&nbsp;&nbsp;&nbsp;多益网络技术面试,由于风评太差,一直在犹豫要不要接面试&nbsp;-&gt;推迟-----------分割线-----------2026.3&nbsp;月前的某一天,临时去电网报名了二批计算机岗位的笔试2026.3.6&nbsp;从上家公司实习离职,氛围最好的一家公司,leader&nbsp;说可以帮忙转正,但是流程太长,而且我们部门据说只有一个&nbsp;hc,更想要研究生,我很有可能是会被签外包公司在这里干活,就离职了。2026.3.9&nbsp;入职新公司,大众Cariad&nbsp;以外部公司的身份进组,项目组签了三年,后续三年应该都可以在这里呆,不知道有没有希望原地跳槽。2026.3.10&nbsp;电网考试居然说我通过资格审查了,短信约我去参加资格审查,请假一天,买了&nbsp;12&nbsp;号晚上的机票回成都2026.3.15&nbsp;参加国家电网计算机类笔试2026.3.17&nbsp;电网出成绩了,感觉很低。觉得已经🈚️了2026.3.18&nbsp;收到电网面试通知,通知&nbsp;3.22-3.25&nbsp;这个时间去面试,我的岗位只招&nbsp;1&nbsp;个人。据说面试只有&nbsp;2-3&nbsp;人,不知道能不能成功----------分割线-----------2026.3.21&nbsp;电网面试结束,感觉回答的还勉勉强强,大概是2个岗位分别招1个人,一共11人面试,实际来了9人2026.3.27&nbsp;出面试成绩,满分100分,早上10:20左右发现面试成绩46,我震惊了,没截图,后面过了十分钟重新看发现面试成绩给我改成58了。但同样震惊。朋友问我是不是把面试官打了,哈哈
点赞 评论 收藏
分享
明明就不饿:看不懂你到底会啥,什么岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务