对话框
- 前言
- 一、模态和非模态对话框
- 1.1 概念
- 1.2 模态对话框
- 1.2.1 代码
- QAction类
- 1.2.2 模态对话框运行分析
- 1.3 非模态对话框
- 1.3.1 代码
- 局部变量和成员变量
- setAttribute 类
- 1.3.2 现象解释
- 二、标准对话框
- 2.1 提示对话框 QMessageBox
- 2.1.1 现象及解释
- 2.2 问题对话框
- 2.2.1 现象解释
- 三、文件对话框
- 所有代码汇总
前言
一、模态和非模态对话框
1.1 概念
1)模态对话框
当它被显示时,会阻止用户与应用程序的其他部分进行交互,直到该对话框被关闭。用户必须先处理模态对话框,完成所需操作(如输入信息、选择选项或确认操作等),之后才能继续操作应用程序的其他部分。
它就像一个临时的交互模式,将用户的操作焦点强制限制在对话框内,其他部分处于不可用状态。
2)非模态对话框
非模态对话框允许用户在不关闭该对话框的情况下,继续与应用程序的其他部分进行交互。用户可以同时操作对话框和应用程序的其他部分,对话框不会限制用户对主程序的操作。
它可以提供辅助信息或持续的操作功能,不会独占用户的操作焦点。
比如:WPS中的一个查找和替换的对话框,你可以打开查找和替换对话框,输入查找和替换的内容,同时你还可以继续在主文档中滚动、编辑文本等操作。该对话框始终显示在屏幕上,你可以随时使用它,但也可以随时操作主界面,它不会强制中断你的主程序操作流程。
1.2 模态对话框
1.2.1 代码
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
这个是一个方法,就是改变变量的生存周期,另外一种就是动态分配空间。
升级版本
QDialog *p = new QDialog;
p->setAttribute(Qt::WA_DeleteOnClose); // 当窗口或对话框关闭时,自动删除该对象。
p->show();
qDebug()<<"run this 2";
局部变量和成员变量
- 局部变量
局部变量是在函数或代码块内部定义的变量,它的作用域仅限于定义它的代码块。
- 局部变量的作用域仅限于其所在的代码块(如函数、循环、条件语句等)。在代码块外部无法访问局部变量。
- 局部变量的生命周期从变量被定义开始,到代码块结束时结束。当代码块执行完毕时,局部变量会被销毁,占用的内存也会被释放。
- 局部变量通常存储在**栈(stack)**中。
- 成员变量
成员变量是定义在类内部的变量,它是类的一部分,用于存储对象的状态信息。
- 成员变量的作用域是整个类,可以在类的任何成员函数中访问。成员变量也被称为类的属性或字段。
- 成员变量的生命周期与对象的生命周期一致。当对象被创建时,成员变量被初始化;当对象被销毁时,成员变量也会被销毁。
- 成员变量通常存储在**堆(heap)**中,与对象的其他部分一起分配内存。
setAttribute 类
用于设置对象的属性(attributes)。这些属性可以影响对象的行为或外观。setAttribute 是 QObject 类的一个成员函数,因此几乎所有 Qt 对象(如窗口、对话框、控件等)都可以使用它。
Qt 提供了许多预定义的属性,可以通过 Qt::WidgetAttribute 枚举来设置。
- Qt::WA_DeleteOnClose:当窗口或对话框关闭时,自动删除该对象。
- Qt::WA_QuitOnClose:当窗口关闭时,调用 QApplication::quit(),退出应用程序。
- Qt::WA_ShowModal:使窗口或对话框以模态方式显示(类似于 exec(),但不阻塞线程)。
- Qt::WA_TranslucentBackground:使窗口的背景透明。
- Qt::WA_TransparentForMouseEvents:使窗口对鼠标事件透明,鼠标事件会传递到窗口下方的控件。
1.3.2 现象解释
二者并存,不会被堵塞。
二、标准对话框
2.1 提示对话框 QMessageBox
添加这段代码
这里需要注意的事情是
2.1.1 现象及解释
对应的关系是,
2.2 问题对话框
查看返回值的枚举内容
添加代码
返回值的内容支持自己指定别的枚举里的内容
2.2.1 现象解释
三、文件对话框
选择了一个文件才会有文件路径显示出来,否则就不会有值被打印!
踩了点坑。。。。
如果需要指定打开文件的目标文件的类型,需要在后面添加
所有代码汇总
mainwindow.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()
{
}
还有这句别忘记加了