Qt操作指南:状态栏、浮动窗口与对话框使用

1. 状态栏

  • 一般在最下面
  • 通过 QStatusBar 来实现状态栏
cpp 复制代码
    // 存在就获取,不存在就创建
    QStatusBar* statusBar=this->statusBar();
    // 如果状态栏没有被创建,这样的设置是必要的
    // 如果状态栏已经在窗口中存在,这样的设置意义不大,但是也没副作用,仍然保留
    this->setStatusBar(statusBar);

    // 显示一个临时的信息
    // statusBar->showMessage("这是一个状态消息",3000);    // 3000ms后消失,可以不设置一直存在

    // 给状态栏中添加子控件
    // addWidget从左往右添加,addPermanentWidget从右往左添加
    QLabel* label1=new QLabel("这是一个 QLabel");
    statusBar->addWidget(label1);   // 可以指定一个拉伸系数

    // QLabel* label2=new QLabel("这是另一个 QLabel");
    // statusBar->addWidget(label2);

    QProgressBar* progressBar=new QProgressBar();
    progressBar->setRange(0,100);
    progressBar->setValue(50);
    statusBar->addWidget(progressBar);

    QPushButton* button=new QPushButton("按钮");
    statusBar->addPermanentWidget(button);

2. 浮动窗口

  • 使用 QDockWidget 创建浮动窗口,可以理解为子窗口,可以随意移动
cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 给主窗口添加一个子窗口
    QDockWidget* dockWidget=new QDockWidget();
    // 使用 addDockWidget 方法,把浮动窗口加入到子窗口中
    this->addDockWidget(Qt::LeftDockWidgetArea,dockWidget);

    // 浮动窗口是可以设置标题的
    dockWidget->setWindowTitle("这是浮动窗口");

    // 给浮动窗口内部,添加一些其他的控件
    // 不能直接给这个浮动窗口添加子控件,而是需要创建出一个单独的 QWidget,把要添加的控件加入到 QWidgte 中
    // 然后再把这个 QWidget 设置到 dockWidget 中(多套一层)
    QWidget* container=new QWidget();
    dockWidget->setWidget(container);

    // 创建布局管理器,把布局管理器设置到 QWidget 中
    QVBoxLayout* layout=new QVBoxLayout();
    container->setLayout(layout);

    // 创建其他控件添加到 layout 中
    QLabel* label=new QLabel("这是一个 QLabel");
    QPushButton* button=new QPushButton("这是按钮");
    layout->addWidget(label);
    layout->addWidget(button);

    // 设置浮动窗口允许停靠的位置
    dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::TopDockWidgetArea);
}

3. 对话框

  • 常用对话框
    • QFiledialog:文件对话框
    • QColorDialog:颜色对话框
    • QFrontDialog:字体对话框
    • QInputDialog:输入对话框
    • QMessageBox:消息框
  • 对话框往往用于用户和用户之间进行"短平快"的操作
  • 基于 QDialog 作为父类创建出来的程序窗口和之前通过 QWidget 创建出来的非常相似
  • 实际开发中,更多的情况,往往不是直接在创建项目的时候继承自 QDialog。而是在代码中,创建额外的类,让额外的类继承自 QDialog
    • 主窗口一般不会作为一个对话框
    • 主窗口可以再产生出一些其他的对话框
  • 一个程序运行过程中,可以产生出无数个QDialog,会导致内存泄露
    • 如果再 this.MainWindow 被销毁之前就存在很多个;即使被 this 管理,最后会释放,风险依然很大
    • 所以让用户点击关闭 QDialog 时就释放(Qt内置的功能)
cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    QDialog* dialog=new QDialog(this);
    dialog->setWindowTitle("这是一个窗口");
    // 设置对话框尺寸
    dialog->resize(400,300);
    // 通过show方法就可以显示出对话框
    dialog->show();
    
    // 把 delete 和关闭按钮的点击信号关联起来
    // 在用户点击关闭的时候触发 delete
    // Qt 为了让咱们写的方便,直接给 QDialog 设置了一个属性,可以通过设置属性,完成上述效果
    dialog->setAttribute(Qt::WA_DeleteOnClose);
}
  • 纯代码实现自定义对话框
cpp 复制代码
#include "dialog.h"
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>

Dialog::Dialog(QWidget* parent) :QDialog(parent)
{
    // 创建出一些控件,加入到Dialog中(以Dialog作为父窗口)
    QVBoxLayout* layout=new QVBoxLayout();
    this->setLayout(layout);
    QLabel* label=new QLabel("这是一个对话框",this);
    QPushButton* button=new QPushButton("关闭",this);
    layout->addWidget(label);
    layout->addWidget(button);

    connect(button,&QPushButton::clicked,this,&Dialog::handle);
}

void Dialog::handle()
{
    this->close();
}
  • 通过图形化界面实现自定义对话框,重点是添加新的ui文件
    ![[添加新的ui文件.png]]

3.1 对话框分类

  • 对话框的 model 属性
    • true:模态
    • false:非模态

3.1.1 模态对话框

  • 显示后无法与父窗口进行交互,阻塞式对话框
  • 完成对话框内部的操作,关闭对话框之后才能操作父窗口
  • 用于特别关键的场合,用户必须做出决策
  • 使用 QDialog::exec() 函数调用

3.1.2 非模态对话框

  • 显示后独立存在,可以同时与父窗口进行交互,非阻塞式对话框
  • 用于不是特别关键的场景
  • 使用 QDialog::show() 函数调用

3.2 QMessageBox 消息框

  • 默认情况只有 OK 按钮
cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    // 创建QMessageBox
    QMessageBox* messageBox =new QMessageBox(this);
    messageBox->setWindowTitle("对话框窗口标题");
    messageBox->setText("这是对话框的文本");
    messageBox->setIcon(QMessageBox::Warning);  //警告
    // 标准按钮中,根本就没法进行信号槽的连接(按钮是 QMessageBox 自己生成的)
    messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);  //添加按钮

    // QPushButton* button=new QPushButton("按钮",messageBox);
    // messageBox->addButton(button,QMessageBox::AcceptRole); // 第二个参数 ButtonRole,设置按钮的作用

    // connect 连接信号槽,来针对当前点击的按钮进行一些相关操作

    // 非模态的弹框,QMessageBox 使用场景更多的是模态的
    // messageBox->show();
    // 弹出模态对话框,当对话框处于弹出状态时,代码就会在 exec 这里阻塞,一直到对话框被关闭
    // 用户点击按钮,是对话框关闭之后,此时就能通过 exec 的返回值,来知道用户点击的是哪个按钮,从而执行一些对应的逻辑了
    int result=messageBox->exec();
    if(result==QMessageBox::Ok)
    {
        qDebug()<<"Ok";
    }
    else if(result==QMessageBox::Save)
    {
        qDebug()<<"Save";
    }else if(result==QMessageBox::Cancel)
    {
        qDebug()<<"Cancel";
    }

    // delete messageBox
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
}
  • 简单的写法

3.3 颜色对话框

  • 常用方法:
    • QColorDialog(QWidget* parent=nullptr):创建对象的同时设置父对象
    • QColorDialog(const QColor &initial,QWidget* parent=nullptr):创建对象的同时通过 QColor 对象设置默认颜色和父对象
    • void setCurrentColor(const QColor& color):设置当前颜色对话框
    • QColor currentColor() const:获取当前颜色对话框
    • QColor getColor(const QColor &initial=Qt::white,QWidget* parent=nullptr,const QString &title=QString(),QColorDialog::CplorDialogOptions options=ColorDialogOptions()):打开颜色选中对话框,并返回一个 QColor 对象
      • initial:设置默认颜色
      • parent:设置父对象
      • title:设置对话框标题
      • options:设置选项
cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    // 函数的返回值就是用户选择的颜色
    QColor color=QColorDialog::getColor(QColor(0,255,0),this,"选择颜色");
    qDebug()<<color;

    // 可以基于用户选中的颜色
    // 可以通过 QSS 的方式设置背景色
    // QString style="background-color: rgb("+QString::number(color.red())+","+QString::number(color.green())
    //                 +","+QString::number(color.blue())+");";
    
    char style[1024]={0};
    sprintf(style,"background-color: rgb(%d,%d,%d);",color.red(),color.green(),color.blue());
    this->setStyleSheet(style);
}

3.4 文件对话框 QFileDialog

  • 文件对话框用于应用程序中需要打开一个外部文件或需要将内容存储到指定的外部文件
  • 常用方法:
    • 打开文件(一次只能打开一个文件)
      • QString getOpenFileName
    • 打开多个文件(一次可以打开多个文件)
      • QStringList getOpenFileNames
    • 保存文件
      • QString getSaveFileName
        ![[打开文件.png]]
        ![[保存文件.png]]
  • 此处的打开/保存需要我们额外去实现,并不是说直接一按就真的保存了

3.5 字体对话框 QFontDialog

  • Qt 中提供了预定义的字体对话框类 QFontDialog
cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    bool ok=false;
    QFont font=QFontDialog::getFont(&ok);
    qDebug()<<"ok="<<ok;
    qDebug()<<font;
    qDebug()<<font.family();
    qDebug()<<font.pointSize();
    qDebug()<<font.bold();
    qDebug()<<font.italic();

    ui->pushButton->setFont(font);
}

3.6 输入对话框 QInputDialog

  • 预定义的输入对话框:QInputDialog,用于进行临时数据输入的场合
  • 常用方法:
    • 双精度浮点型输入数据对话框
      • double getDouble
    • 整型输入数据对话框
      • int getInt
    • 选择条目型输入数据框(用户可以不选择列表里的内容,自己输入)
      • QString getItem
cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    int result=QInputDialog::getInt(this,"整数输入对话框","请输入一个整数: ");
    qDebug()<<result;
}

void MainWindow::on_pushButton_2_clicked()
{
    float result=QInputDialog::getDouble(this,"浮点数输入对话框","请输入一个浮点数: ");
    qDebug()<<result;
}

void MainWindow::on_pushButton_3_clicked()
{
    QStringList items;
    items.push_back("111");
    items.push_back("222");
    items.push_back("333");
    items.push_back("444");
    QString item=QInputDialog::getItem(this,"条目输入对话框:","请输入条目",items);
    qDebug()<<item;
}
相关推荐
sweetone2 小时前
迷你电吹风速修
经验分享·嵌入式硬件
APIshop2 小时前
小红书笔记视频详情接口深度解析:smallredbook.item_get_video_pro
数据库·笔记·音视频
y = xⁿ2 小时前
MySQL学习笔记:乐观锁VS悲观锁/八股总结
笔记·学习·mysql
d111111111d2 小时前
STM32-UART抽象层封装
笔记·stm32·单片机·嵌入式硬件·学习
chushiyunen2 小时前
notion(模块化数字工作台)笔记
笔记·notion
minji...2 小时前
Linux 线程同步与互斥(五) 日志,线程池
linux·运维·服务器·开发语言·c++·算法
兩尛2 小时前
c++面试常问2
开发语言·c++·面试
Rust研习社2 小时前
添加依赖库时的 features 是什么?优雅实现编译期条件编译与模块化开发
开发语言·后端·rust
Tel199253080043 小时前
ENDAT2.2 协议信号转 SSI /BISS-C转换卡 ENDAT2.2 协议信号转DMC多摩川高速协议转换器 互转卡
c语言·开发语言·网络