【Qt】06-对话框

对话框


前言


一、模态和非模态对话框

1.1 概念

1)模态对话框

当它被显示时,会阻止用户与应用程序的其他部分进行交互,直到该对话框被关闭。用户必须先处理模态对话框,完成所需操作(如输入信息、选择选项或确认操作等),之后才能继续操作应用程序的其他部分。

它就像一个临时的交互模式,将用户的操作焦点强制限制在对话框内,其他部分处于不可用状态。

2)非模态对话框

非模态对话框允许用户在不关闭该对话框的情况下,继续与应用程序的其他部分进行交互。用户可以同时操作对话框和应用程序的其他部分,对话框不会限制用户对主程序的操作。

它可以提供辅助信息或持续的操作功能,不会独占用户的操作焦点。

比如:WPS中的一个查找和替换的对话框,你可以打开查找和替换对话框,输入查找和替换的内容,同时你还可以继续在主文档中滚动、编辑文本等操作。该对话框始终显示在屏幕上,你可以随时使用它,但也可以随时操作主界面,它不会强制中断你的主程序操作流程。

1.2 模态对话框

1.2.1 代码

mainwindow.cpp

mainwindow.cpp 复制代码
#include "mainwindow.h"
#include <QMenu>
#include <QMenuBar>
#include <QAction>
#include <QDialog>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QMenuBar *mBar = menuBar();
    setMenuBar(mBar);
    QMenu *menu = mBar->addMenu("对话框");
    QAction *p1 = menu->addAction("模态对话框");
    connect(p1,&QAction::triggered,
            [=]()
            {
                QDialog dialog;
                dialog.exec();              // 程序会运行到这里等待用户操作
                qDebug()<<"run this";
            }
            );
}

MainWindow::~MainWindow()
{

}
QAction类

用于表示一个可执行的操作(action)。它在图形用户界面(GUI)编程中非常常用,尤其是在涉及菜单、工具栏和快捷键的场景中。

可以轻松地将这些操作与菜单项、工具栏按钮或快捷键绑定。

1.2.2 模态对话框运行分析

刚开始运行的界面

点击之后,进入槽函数

关闭对话框,即可出现

模态对话框会阻塞其父窗口的输入,直到对话框被关闭。用户必须先处理完对话框中的操作,才能继续操作父窗口。

1.3 非模态对话框

1.3.1 代码

在上一个的基础上add

这个是一个方法,就是改变变量的生存周期,另外一种就是动态分配空间。

升级版本

cpp 复制代码
                QDialog *p = new QDialog;
                p->setAttribute(Qt::WA_DeleteOnClose);      // 当窗口或对话框关闭时,自动删除该对象。
                p->show();
                qDebug()<<"run this 2";
局部变量和成员变量
  • 局部变量

局部变量是在函数或代码块内部定义的变量,它的作用域仅限于定义它的代码块。

  1. 局部变量的作用域仅限于其所在的代码块(如函数、循环、条件语句等)。在代码块外部无法访问局部变量。
  2. 局部变量的生命周期从变量被定义开始,到代码块结束时结束。当代码块执行完毕时,局部变量会被销毁,占用的内存也会被释放。
  3. 局部变量通常存储在**栈(stack)**中。
  • 成员变量

成员变量是定义在类内部的变量,它是类的一部分,用于存储对象的状态信息。

  1. 成员变量的作用域是整个类,可以在类的任何成员函数中访问。成员变量也被称为类的属性或字段。
  2. 成员变量的生命周期与对象的生命周期一致。当对象被创建时,成员变量被初始化;当对象被销毁时,成员变量也会被销毁。
  3. 成员变量通常存储在**堆(heap)**中,与对象的其他部分一起分配内存。
setAttribute 类

用于设置对象的属性(attributes)。这些属性可以影响对象的行为或外观。setAttribute 是 QObject 类的一个成员函数,因此几乎所有 Qt 对象(如窗口、对话框、控件等)都可以使用它。

Qt 提供了许多预定义的属性,可以通过 Qt::WidgetAttribute 枚举来设置。

  1. Qt::WA_DeleteOnClose:当窗口或对话框关闭时,自动删除该对象。
  2. Qt::WA_QuitOnClose:当窗口关闭时,调用 QApplication::quit(),退出应用程序。
  3. Qt::WA_ShowModal:使窗口或对话框以模态方式显示(类似于 exec(),但不阻塞线程)。
  4. Qt::WA_TranslucentBackground:使窗口的背景透明。
  5. Qt::WA_TransparentForMouseEvents:使窗口对鼠标事件透明,鼠标事件会传递到窗口下方的控件。

1.3.2 现象解释

二者并存,不会被堵塞。

二、标准对话框

2.1 提示对话框 QMessageBox

添加这段代码

这里需要注意的事情是

2.1.1 现象及解释

对应的关系是,

2.2 问题对话框

查看返回值的枚举内容

添加代码

返回值的内容支持自己指定别的枚举里的内容

2.2.1 现象解释

三、文件对话框

选择了一个文件才会有文件路径显示出来,否则就不会有值被打印!

踩了点坑。。。。

如果需要指定打开文件的目标文件的类型,需要在后面添加


所有代码汇总

mainwindow.cpp

cpp 复制代码
#include "mainwindow.h"
#include <QMenu>
#include <QMenuBar>
#include <QAction>
#include <QDialog>
#include <QDebug>
#include <QMessageBox>
#include <QFileDialog>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QMenuBar *mBar = menuBar();
    setMenuBar(mBar);
    QMenu *menu = mBar->addMenu("对话框");
    QAction *p1 = menu->addAction("模态对话框");
    connect(p1,&QAction::triggered,
            [=]()
            {
                QDialog dialog;
                dialog.exec();              // 程序会运行到这里等待用户操作
                qDebug()<<"run this";
            }
            );

    QAction *p2 = menu->addAction("非模态对话框");
    connect(p2,&QAction::triggered,
            [=]()
            {
//                QDialog dialog;
//                dialog.show();

                QDialog *p = new QDialog;
                p->setAttribute(Qt::WA_DeleteOnClose);      // 当窗口或对话框关闭时,自动删除该对象。
                p->show();
                qDebug()<<"run this 2";
            }
            );

    QAction *p3 = menu->addAction("关于对话框");
    connect(p3,&QAction::triggered,
            [=]()
            {
                QMessageBox::about(this,"about","关于qt");
            }
            );
    QAction *p4 = menu->addAction("问题对话框");
    connect(p4,&QAction::triggered,
            [=]()
            {
                int back = QMessageBox::question(this,
                                                 "question","吃了吗?",
                                                 QMessageBox::Ok,
                                                 QMessageBox::Cancel);
                switch (back)
                {
                    case QMessageBox::Ok:
                        qDebug() << "吃了";
                        break;
                    case QMessageBox::Cancel:
                        qDebug() << "肚肚饿饿";
                        break;
                    default:
                        break;
                }
            }
            );
    QAction *p5 = menu->addAction("文件对话框");
    connect(p5,&QAction::triggered,
            [=]()
            {
//                QString FilePath = QFileDialog::getOpenFileName(this,"open","../");
                QString FilePath = QFileDialog::getOpenFileName(this,
                                                                "open","../",
                                            "source(*.cpp *.h);;Text(*txt);;all(*.*)");
                qDebug()<<"文件路径"<<FilePath;
            }
            );
}

MainWindow::~MainWindow()
{

}

还有这句别忘记加了

相关推荐
qq_4476630534 分钟前
java-----多线程
java·开发语言
a辰龙a36 分钟前
【Java报错解决】警告: 源发行版 11 需要目标发行版 11
java·开发语言
听海边涛声38 分钟前
JDK长期支持版本(LTS)
java·开发语言
IpdataCloud38 分钟前
Java 获取本机 IP 地址的方法
java·开发语言·tcp/ip
MyMyMing39 分钟前
Java的输入和输出
java·开发语言
Easonmax41 分钟前
【javaSE】内部类(来自类和对象的补充)
开发语言·javascript·ecmascript
云夏之末43 分钟前
【Java报错已解决】java.lang.UnsatisfiedLinkError
java·开发语言
li星野2 小时前
QT:图像上绘制图形
开发语言·qt
花落已飘2 小时前
RK3568中使用QT opencv(显示基础图像)
开发语言·qt·opencv
Mr_Xuhhh2 小时前
进程间通信
android·java·服务器·开发语言·数据库