一、对话框
- 在软件开发中,对话框(Dialog)是一种常见的用户界面元素,用于与用户进行交互和获取信息。它通常以模态或非模态的形式出现,模态对话框会阻止用户与应用程序的其他部分交互,直到对话框关闭为止,而非模态对话框允许用户在对话框打开的同时与应用程序的其他部分交互。
 
- 在UI界面就是Dialog Button Box控件,包含所有对话框,具体使用特定的对话框时,需要包含其特定的头文件。
 
- 父对象可以填写this,表示必须先处理该对话框才能在父对象上操作,填写nullptr,则不用,可能导致父对象,关闭,而对话框不关闭
 
- 检查用户是否取消了对话框操作,并适当处理这种情况。例如,在文件选择对话框中,如果返回的路径为空,表示用户取消了操作。
 
- 使用输入对话框,先包含头文件<QInputDialog>
 
- QString txt = QInputDialog::getText(父对象,QString 标题,QString 内容描述。
例如QString date = QInputDialog::getText(this,"星期","请输入星期几");getText的返回值就是你输入的内容,它属于QString类。 
2.消息对话框
- 使用消息对话框,先包含头文件<\QMessageBox>
 
- 如你所见,是Box->盒子,即它也多种类型。不过使用方法一样,就是提醒图片略有不同。包含information、warning、critical、question对话框。
 
- 按键值 = QMessageBox::information(父对象,QString 标题,QString 提示,按键组合,默认按键);
information可以替换为:warning、critical、question 
- 举例
 
        
          
            
            
              markup
              复制代码
              
            
          
          QMessageBox::StandardButton btn;//存储用户的选择结果。是枚举类型喔
btn = QMessageBox::information(this,"标题:告示","今天食堂不营业",QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes);
 
然后可以根据用户的选择进行相应的操作如,if,Switch等。
         
      3.文件对话框
- 文件对话框是一个标准的对话框,允许用户选择一个或多个文件来打开、保存或选择目录。在 Qt 中,QFileDialog 类提供了丰富的功能来处理这些需求。
 
- 使用文件对话框,先包含头文件<\QFileDialog>
 
QFileDialog::getOpenFileName 是 Qt 中用于显示文件打开对话框的方法。它允许用户选择一个文件并返回所选文件的路径。
使用方法 
        
          
            
            
              markup
              复制代码
              
            
          
          原型:QString QFileDialog::getOpenFileName(QWidget *parent = nullptr, 
                                     const QString &caption = QString(), 
                                     const QString &dir = QString(), 
                                     const QString &filter = QString(), 
                                     QString *selectedFilter = nullptr, 
                                     QFileDialog::Options options = QFileDialog::Options())
QString filename = QFileDialog::getOpenFileName(父对象,标题,默认路径,筛选器);
筛选器: 通常以后缀来进行筛选,如*.txt,*.png等等。但是";;"的左边和右边是互斥选择的。
filename存储的你所选择的路径,即getOpenFileName的返回值。
举例代码
QString filename = QFileDialog::getOpenFileName(this,"标题:请选择一个文件","./", "*.txt ;; *.c *.h " );
if(filename.isEmpty() ){
    qDebug()<<"you select none";
    return;
}
qDebug()<<"you will open "<<filename;
注意
getOpenFileNames只需要将接受返回值的类型改为QStringList类型即可。
         
      
- QFileDialog::getSaveFileName 是 Qt 中用于显示保存文件对话框的方法。它允许用户选择保存文件的位置和名称,并返回所选文件的路径。格式与getOpenFileName差不多
 
        
          
            
            
              markup
              复制代码
              
            
          
            QString fn = QFileDialog::getSaveFileName(this,"标题:请输入保存的文件名",".","*.png ;; *.jpeg *.jpg");
  qDebug()<<"you will save "<<fn;
         
      
- QFileDialog::getExistingDirectory 是 Qt 中用于显示目录选择对话框的方法。它允许用户选择一个目录,并返回所选目录的路径。
 
        
          
            
            
              markup
              复制代码
              
            
          
           QFileDialog::getExistingDirectory(父对象,"标题:选择路径","默认路径");*/
    QString fn = QFileDialog::getExistingDirectory(this,"标题:选择路径",".");
         
      
- 代码


 
二、布局
- 在Qt中进行布局是一个非常常见的任务,通常使用布局管理器(Layout Managers)来组织和管理窗口部件的位置和大小。
 
- 它们之间是可以嵌套使用的
 
1.vertical layout
- 垂直布局(QVBoxLayout)是Qt中的一个布局管理器,用于将控件垂直排列在窗口或其他容器中。其主要作用是方便地管理和组织窗口部件的位置和大小,使界面看起来更加整洁和易于调整。
 

 
2. horizontal layout
- 水平布局(QHBoxLayout)是Qt中的一个布局管理器,用于将控件水平排列在窗口或其他容器中。
 

 
3. grid layout
- 网格布局(QGridLayout)是Qt中的一个布局管理器,用于将控件按照网格形式排列在窗口或其他容器中
 
- 特点:
 
- 网格排列:控件可以按照指定的行和列放置,每个控件可以占据一个或多个网格单元。
 
- 灵活性:可以方便地添加、删除或重新排列布局中的控件,而不会影响到其它部分的布局。
 
- 自适应调整:当窗口大小改变时,网格布局会自动调整控件的位置和大小,以适应新的窗口尺寸。
3.示例

 
4. Horizontal spacer和vertical spacer
- 用于在布局中创建空白空间或者弹性空间:QSpacerItem 和 QSizePolicy::Expanding。它们可以帮助实现在布局中控制部件之间的间距或者使部件在布局中扩展以填充空白区域。
 

 
三、菜单
- Qt中的菜单栏(QMenuBar)是一个用于在应用程序中创建和管理菜单的控件。它通常位于窗口的顶部,并包含多个菜单项。每个菜单项可以包含多个子项(动作),这些动作可以触发特定的功能或操作。菜单栏在用户界面设计中起着重要作用,提供了对应用程序功能的结构化访问。
 
- 使用ui设计器时,选择QMainWindows,会在ui界面多一行菜单栏

 
- setContextMenuPolicy()
 
- setContextMenuPolicy() 函数是 Qt 中用于设置控件上下文菜单策略的方法。它决定了当用户在控件上执行右键单击时如何处理和显示上下文菜单。
 
- 括号内参数有
Qt::NoContextMenu / Qt::preventContextMenu / Qt::CustomContextMenu/Qt::DefaultContextMenu ,分别代表:没有 右击菜单,阻止 右击菜单产生,允许 右击事件产生,默认值 
- 如果设置为 Qt::DefaultContextMenu,则会显示控件默认的上下文菜单,这通常由 Qt 框架根据控件类型和平台决定。
 
- 允许右击菜单产生,将会发出
customContextMenuRequested(const QPoint&)信号,传递的参数是右键单击事件发生时的鼠标指针位置,属于高级用法。 
- QMenu *pMenu; ,指向 QMenu 类型的指针变量,用于管理菜单,在Widget.h中创建,可以在定义的槽函数里面使用,但要注意的是在构造函数里面实例化时候是
pMeu = new QMenu;,而不是QMenu *pMenu = new QMenu;,它属于没有在Widget.h中定义,在构造函数中实例化的方法。一定要注意,因为这样写错了,代码不会报错,但是会运行时出错。 
- ACtion
 
- QAction 是 Qt 中用于表示用户界面中的动作或命令的类。它通常用于菜单、工具栏、快捷键等场景,用来定义用户可以执行的操作。
QAction *action = new QAction("动作名称", this); 
- 加入到菜单里面使用函数addAction;
pMenu->addAction(pCut); 
- 它的信号为triggered()
 
        
          
            
            
              cpp
              复制代码
              
            
          
          pActDel = new QAction("Del");
 connect(pActDel,SIGNAL(triggered()),this,SLOT( pActDelTriggeredSlotFun() ));
         
      
- QCursor::pos();,它的返回值为当前鼠标光标的全局位置坐标。通过调用 move() 函数将 pMenu 移动到鼠标光标的位置。
 
- move() 函数用于移动窗口或控件到指定的坐标位置。
 
        
          
            
            
              cpp
              复制代码
              
            
          
          pMenu->move(QCursor::pos());//移动位置
pMenu->show();//使菜单显示出来
这两行代码的作用是确保在哪里右击,就在哪里显示右击菜单栏
         
      
- 示例代码
 
        
          
            
            
              cpp
              复制代码
              
            
          
          #include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>  // 包含 QMessageBox 类头文件
#include <QDebug>       // 包含 qDebug() 函数的头文件
Widget::Widget(QWidget *parent)
    : QWidget(parent),  // 调用父类 QWidget 的构造函数
      ui(new Ui::Widget)  // 初始化界面类对象 ui
{
    ui->setupUi(this);  // 设置界面布局
    // 创建主菜单和子菜单
    pMenu1 = new QMenu("菜单11");  // 创建名称为 "菜单11" 的子菜单对象
    pMenu = new QMenu("菜单");      // 创建名称为 "菜单" 的主菜单对象
    // 创建动作(菜单项)
    pCut = new QAction("剪切");    // 创建名称为 "剪切" 的动作对象
    pCopy = new QAction("复制");   // 创建名称为 "复制" 的动作对象
    pPoaste = new QAction("粘贴"); // 创建名称为 "粘贴" 的动作对象
    pDel = new QAction("删除");    // 创建名称为 "删除" 的动作对象
    pIns = new QAction("子菜单");  // 创建名称为 "子菜单" 的动作对象
    // 设置标签控件的上下文菜单策略为自定义上下文菜单
    ui->label->setContextMenuPolicy(Qt::CustomContextMenu);
    // 连接标签控件的自定义上下文菜单请求信号到槽函数
    connect(ui->label, SIGNAL(customContextMenuRequested(const QPoint&)),
            this, SLOT(labelCustomContextMenuRequestedSlotFun(const QPoint&)));
    // 将子菜单添加到主菜单中
    pMenu->addMenu(pMenu1);
    // 在子菜单中添加动作(菜单项)
    pMenu1->addAction(pIns);
    // 在主菜单中添加动作(菜单项)
    pMenu->addAction(pCut);
    pMenu->addAction(pCopy);
    pMenu->addAction(pPoaste);
    pMenu->addAction(pDel);
    // 连接删除动作的触发信号到槽函数
    connect(pDel, SIGNAL(triggered()), this, SLOT(pDelTriggeredSlotFun()));
}
Widget::~Widget()
{
    delete ui;  // 释放界面类对象内存
}
// 处理标签控件的自定义上下文菜单请求槽函数
void Widget::labelCustomContextMenuRequestedSlotFun(const QPoint &p)
{
    qDebug() << __func__ << p;  // 打印函数名和鼠标右击位置坐标
    // 将主菜单移动到鼠标光标的位置并显示
    pMenu->move(QCursor::pos());
    pMenu->show();
}
// 处理删除动作的槽函数
void Widget::pDelTriggeredSlotFun()
{
    // 显示删除确认对话框,并等待用户响应
    QMessageBox::StandardButton btn = QMessageBox::question(this,
                                                            "删除",
                                                            "你确认要删除对象吗?",
                                                            QMessageBox::Yes | QMessageBox::Cancel,
                                                            QMessageBox::Cancel);
    if (btn == QMessageBox::Yes) {
        // 如果用户点击了确认按钮,执行删除操作
        qDebug() << "执行删除操作";
    } else {
        // 如果用户点击了取消按钮,输出取消删除操作信息
        qDebug() << "取消删除操作";
    }
}