Qt窗口:QToolBar、QStatusBar、QDockWidget、QDialog

目录

认识工具栏

状态栏

子窗口

对话框


认识工具栏

工具栏不同于菜单栏,工具栏可以有多个,也可以没有。

工具栏往往是一些常用的菜单项的快捷方式。

工具栏可以是文本形式表示,然而更多的设计方式是用图标表示,图标会覆盖文本,但不是完全覆盖,因为当鼠标悬浮在图标上时,文本以toolTip的方式显示。

cpp 复制代码
    QToolBar* toolBar = new QToolBar();
    this->addToolBar(toolBar);

    QAction* action = new QAction("保存");
    toolBar->addAction(action);
  • 工具栏往往搭配菜单栏使用
cpp 复制代码
    //创建菜单栏
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);
    //添加一个菜单
    QMenu* menu = new QMenu("文件");
    menuBar->addMenu(menu);
    //
    QToolBar* toolBar = new QToolBar();
    this->addToolBar(toolBar);

    //菜单项添加到工具栏
    QAction* action = new QAction("保存");
    toolBar->addAction(action);

    //菜单项添加到菜单
    menu->addAction(action);
  • 工具栏的浮动

仔细观察工具栏,前面有三个点,说明工具栏是可以拖动的,如果使用过VS,对VS中工具栏的上下左右拖动就会很熟悉。

Qt可以在代码中设置浮动的属性,比如默认停靠在左边还是右边,可以在哪些地方停靠,可以设置它是否允许浮动。

cpp 复制代码
//默认在左边    
QToolBar* toolBar = new QToolBar();
this->addToolBar(Qt::LeftToolBarArea,toolBar);
cpp 复制代码
//设置允许在哪些地方停靠
toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
cpp 复制代码
//设置不允许浮动,即只能在左或者右,不可以浮动在任意位置了
toolBar->setFloatable(false);
cpp 复制代码
//设置不允许移动,只能停靠在默认位置
toolBar->setMovable(false);

状态栏

状态栏和菜单栏,默认情况下Qt Creator会自动生成,所以不用再单独new。

  • 显示临时文本
cpp 复制代码
//临时显示文本
statusBar->showMessage("一段文本",3000);
cpp 复制代码
    QStatusBar* statusBar = ui->statusbar;
    this->setStatusBar(statusBar);

    //临时显示文本
    //statusBar->showMessage("一段文本",3000);

    //给状态栏添加子控件
    QLabel* label = new QLabel("这是一个Label");
    statusBar->addWidget(label,1);//第二个参数是拉伸系数


    //添加一个进度条
    QProgressBar* prB = new QProgressBar();
    prB->setRange(1,200);
    prB->setValue(130);
    statusBar->addWidget(prB,2);


    //添加一个按钮,从右边添加
    QPushButton* but = new QPushButton("按钮");
    statusBar->addPermanentWidget(but);

子窗口

子窗口,又称浮动窗口,Qt用QDockWidget类来表示子窗口。

cpp 复制代码
    //给主窗口添加一个子窗口
    QDockWidget* dock = new QDockWidget();
    this->addDockWidget(Qt::LeftDockWidgetArea,dock);

    //设置标题
    dock->setWindowTitle("一个子窗口");
    //给子窗口中添加控件
    //注意,子窗口只能有一个QWidget控件,然后向QWidget中添加多个控件。
    QWidget* widget = new QWidget();
    dock->setWidget(widget);

    //添加布局管理器
    QVBoxLayout* layout = new QVBoxLayout();
    widget->setLayout(layout);

    QLabel* label = new QLabel("标签");
    QPushButton* but = new QPushButton("按钮");

    layout->addWidget(label);
    layout->addWidget(but);

    //设置子窗口的停靠属性
    dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

对话框

Qt用QDialog表示对话框。

Qt内置了很多对话框。

可以在创建项目的时候,将主窗口选择为对话框,但是实际开发中,往往是创建一个类,让这个类继承QDialog。

QDialog可以同时存在很多个,因此可能出现内存泄露的问题,而对话框的释放往往难以把握位置,于是把对话框的关闭信号和释放关联在一起,Qt提供了这样的便捷设置。

cpp 复制代码
dialog->setAttribute(Qt::WA_DeleteOnClose);
  • 自定义一个对话框

首先创建一个MainWindow项目。

给项目里面添加一个新的类。

新建一个按钮

这是它的槽函数

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    Dialog* dialog = new Dialog();
    dialog->resize(400,300);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();
}

Dialog的构造函数如下,自定义的对话框里面有按钮、标签。

cpp 复制代码
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
Dialog::Dialog()
{
    QVBoxLayout* layout = new QVBoxLayout();
    this->setLayout(layout);
    QPushButton* but = new QPushButton("这是一个按钮");
    QLabel* label = new QLabel("这是一个标签");

    layout->addWidget(but);
    layout->addWidget(label);


}

最终效果。

  • 模态和非模态

对话框弹出来以后,必须处理完对话框,才能处理父窗口的现象称为模态,反之为非模态。

设置模态的代码很简单,在展示对话框的时候,将show函数换成exec函数即可。

  • Qt提供了很多标准对话框,继承自QDialog
  • 消息对话框QMessageBox

这些内置的对话框基本都有相应的静态函数,可以不用创建对象,直接调用来弹出对话框。

相关推荐
..过云雨几秒前
13.【Linux系统编程】从ELF格式深入理解动静态库
linux·c语言·c++·后端
长沙红胖子Qt7 分钟前
QGIS开发笔记(五):qgis加载标记点功能,基础标记数量与性能对比测试
c++
.普通人16 分钟前
stm32f103c8t6寄存器点灯法
stm32·单片机·嵌入式硬件
qq_4017004116 分钟前
QT的5种标准对话框
开发语言·qt
q***071423 分钟前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
Bear on Toilet43 分钟前
C++_Bug:现代写法拷贝构造中 swap 写法之小坑
数据结构·c++·bug
智者知已应修善业1 小时前
【给定英文字符串统计最多小写最前输出】2023-2-27
c语言·开发语言·c++·经验分享·笔记·算法
秋天之落叶1 小时前
使用ADO将excel表内容加载到mssql表中的长度问题
数据库·sqlserver·excel
电子工程师-C511 小时前
基于单片机的智能手表
单片机·嵌入式硬件·智能手表
毕设十刻1 小时前
基于Vue的售票系统开发3g480(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js