【Qt窗口】—— 对话框

2024-08-31 20:04
文章标签 qt 窗口 对话框

本文主要是介绍【Qt窗口】—— 对话框,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

(一) 对话框介绍

(二)对话框的分类

2.1 模态对话框 

2.2 非模态对话框

2.3 混合属性对话框

(三)内置对话框

消息对话框 QMessageBox

颜色对话框 QColorDialog

 字体对话框 QFontDialog

输入对话框 QInputDialog

文件对话框 QFiledialog

总结


(一) 对话框介绍

我们有的时候打开某些网站,不经意间可能就会弹出各种奇奇怪怪的窗口,这个就可以叫做“对话框”,对话框往往在用户与用户之间进行“短平快” 的操作。

对话框是GUI程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框 中。对话框通常是⼀个顶层窗口,出现在程序最上层,⽤于实现短期任务或者简洁的用户交互。

Qt常用的内置对话框有:

  • QMessageBox(消息框)
  • QColorDialog(颜色对话框)
  • QFontDialog (字体对话框)
  • QInputDialog(输入对话框)
  • QFiledialog(文件对话框)

(二)对话框的分类

对话框主要可以分为模态对话框⾮模态对话框 。

2.1 模态对话框 

模态对话框指的是:显示后无法与父窗口进行交互,是⼀种阻塞式的对话框。使用QDialog::exec()函数调用。

模态对话框适用于必须依赖用户选择的场合,⽐如消息显示,文件选择,打印设置等。

 示例:

  • 1、新建Qt项⽬,在ui⽂件中的菜单栏中设置两个菜单:"文件"和"编辑",在菜单"文件"下新建菜单项:"创建"并将菜单项"新建"置于工具栏中;如下图示:

  • 2、在mainwindow.cpp⽂件中实现:当点击"新建"时,弹出⼀个模态对话框(在菜单项中,点击菜单项时就会触发triggered()信号); 


2.2 非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互,是⼀种非阻塞式对话框,使用QDialog::show()函数调用。

  • ⾮模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的⾮模态对话框就会⼀闪⽽过。

⾮模态对话框适用于特殊功能设置的场合,⽐如查找操作,属性设置等。 

示例:

    QDialog *dialog = new QDialog();//设置 大小dialog->resize(700,500);//设置标题dialog->setWindowTitle("this is a dialog");//关闭窗口的时候触发delete操作dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->show();

【说明】

  • QDialog其实也是QWidget的子类,QWidget 的各种属性方法,在QDialog也同样适用。
  • 同时还需要设置Qt:WA_DeleteOnClose属性,⽬的是:当创建多个⾮模态对话框时(如打开了多个非模态对话框),为了避免内存泄漏要设置此属性。 

2.3 混合属性对话框

混合属性对话框同时具有模态对话框和非模态对话框的属性,对话框的生成和销毁具有非模态对话框属性,功能上具有模态对话框的属性。


使用QDialog::setModal()函数可以创建混合特性的对话框。通常,创建对话框时需要指定对话框的父组件。

示例:


 

(三)内置对话框

Qt提供了多种可复复用的对话框类型,即Qt标准对话框。Qt标准对话框全部继承于QDialog类。常用标准对话框如下:
 

消息对话框 QMessageBox

消息对话框是引用程序最常用的界面元素,消息对话框主要用于为用户提示重要消息,强制用户进行选择操作。其次QMessageBox是预定义的对话框,不需要手动创建布局和控件,非常适合用于显示简单的消息和接收用户的简单输入。

QMessageBox 提供了多种静态方法来快速显示不同类型的消息框:

  • information:显示一个信息消息框
QMessageBox::information(QWidget *parent, const QString &title, const QString &text
)

 接下来,我们简单通过代码实现一下:

    QMessageBox* MessageBox = new QMessageBox(this);MessageBox->setWindowTitle("对话框窗口标题!");MessageBox->setText("这是对话框文本");MessageBox->setIcon(QMessageBox::Information); //显示信息消息框MessageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save |         QMessageBox::Cancel);//非模态对话框MessageBox->show();//模态对话框//弹出对话框,当对话框处于弹出状态时,代码就会在exec这里阻塞,一直到对话框关闭MessageBox->exec();//delete MessageBoxMessageBox->setAttribute(Qt::WA_DeleteOnClose);

输出展示:

 

虽然QMessageBox提供了许多预定义的选项,但你也可以自定义消息框的外观和行为。就接着上述代码,我们进行判断: 

    int res = MessageBox->exec();if(res == QMessageBox::Ok){qDebug() << "ok";}else if(res == QMessageBox::Save){qDebug() << "Save";}else if(res == QMessageBox::Cancel){qDebug() << "Cancel";}

当然,除了上述手动代码实现之外,我们还可以通过Qt中给出的静态方法进行实现。具体如下:

    int resutlt = QMessageBox::information(this,"对话框标题","对话框文本",QMessageBox::Ok |     QMessageBox::Cancel);if(resutlt == QMessageBox::Ok){qDebug() <<"ok";}else if(resutlt == QMessageBox::Cancel){qDebug() <<"cancle";}

其中可以设置的按钮的类型如下:


以下代码跟上述类似,就不在展开。

  • warning :显示一个警告消息框
QMessageBox::warning(QWidget *parent, const QString &title, const QString &text
)
  • critical :显示一个严重错误消息框
QMessageBox::critical(QWidget *parent, const QString &title, const QString &text
)
  • question :显示一个问题消息框,允许用户做出选择
QMessageBox::question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = NoButton, QMessageBox::StandardButton defaultButton = NoButton
)

颜色对话框 QColorDialog

 在Qt中,颜色对话框是通过QColorDialog 类实现的,它允许用户选择颜色。QColorDialog提供了一个标准的界面,让用户可以浏览和选择颜色。它是一个模态对话框,意味着它会阻塞其父窗口直到用户做出选择或取消对话框。

颜⾊对话框如下图示: 

 根据我们上述的理解,我们可能会在此处写出下列代码:

    QColorDialog* color = new QColorDialog();color->exec();delete  color;

但是在QColorDialog中提供了自己的方法。具体如下:

//打开颜⾊选择对话框,并返回⼀个QColor对象
QColorgetColor(const QColor &initial = Qt::white,QWidget *parent = nullptr,const QString &title = QString(),QColorDialog::ColorDialogOptions options = ColorDialogOptions()
)参数说明:
initial:设置默认颜⾊
parent:设置⽗对象
title:设置对话框标题
options:设置选项

示例如下:

     //函数的返回值就是用户选择的颜色QColor color = QColorDialog::getColor(QColor(255,0,0),this,"选择颜色");qDebug() << color;

输出展示: 

 其次,我们还可以基于用户选择设置窗口颜色:

    //可以基于用户选择的颜色,修改窗口色//方法一QString style = "background-color: rgb(" + QString::number(color.red()) + ", " +   QString::number(color.green()) + ", "+  QString::number(color.blue()) + ");";this->setStyleSheet(style);//方法二char buffer[1024] = {0};         sprintf(buffer,"backgroundcolor:rgb(%d,%d,%d);",color.red(),color.green(),color.blue());this->setStyleSheet(buffer);

 

 字体对话框 QFontDialog

在Qt中,QFontDialog类用于显示一个字体选择对话框,允许用户选择字体的样式、大小、粗细等属性。其次这个对话框是模态的,提供了一个简单而强大的方式来让用户选择字体,适用于需要字体选择功能的应用程序

示例:

    bool flag = false;QFont font = QFontDialog::getFont(&flag);//qDebug() << font;qDebug() << "ok = " << flag;qDebug() <<"字体" <<font.family();qDebug() << "获取字号" <<font.pointSize();qDebug() << "是否倾斜" <<font.italic();qDebug() << "是否加粗" << font.bold();//把对话框文件字体进行设置ui->pushButton->setFont(font);

运行效果如下:

 


输入对话框 QInputDialog

在Qt中,QInputDialog 是一个用于提供简单输入的对话框类,它允许用户输入文本、数字或选择列表中的一个选项。这个对话框是模态的,提供了快速而简单的方式来获取用户输入,适用于不需要复杂输入界面的场景

常用方法介绍:

  • 1、双精度浮点型输入数据对话框
double getDouble(QWidget *parent,const QString &title,const QString &label,double value=0,double min=-2147483647,double max=2147483647,int decimals=1,bool *ok=nullptr,Qt::WindowFlags flags=Qt::WindowFlags()
);
  • 2、整型输入数据对话框
int getInt(QWidget *parent,const QString &title,const QString &label,int value=0,int min=-2147483647,int max=2147483647,int step=1,bool* ok=nullptr,Qt::WindowFlagsflags=Qt::WindowFlags()
);

  • 3、选择条目型输入数据框
QString getItem(QWidget *parent,const QString &title,const QString &label,const QStringList &items,int current=0,bool editable=true,bool *ok=nullptr,Qt::WindowFlags flags=Qt::WindowFlags(),Qt::InputMethodHints inputMethodHints=Qt::ImhNone
);参数说明:
parent:⽗亲
title:对话框标题
label:对话框标签
items:可供选择的条⽬

示例

void MainWindow::on_pushButton_clicked()
{//打印整数int res = QInputDialog::getInt(this,"整数输入对话框","请输入一个整数:");qDebug() << res;
}void MainWindow::on_pushButton_2_clicked()
{//打印浮点数float res = QInputDialog::getDouble(this,"整数输入对话框","请输入一个浮点数:");qDebug() << res;
}void MainWindow::on_pushButton_3_clicked()
{//打印条目QStringList item;item.push_back("111");item.push_back("222");item.push_back("333");item.push_back("444");QString body = QInputDialog::getItem(this,"条目输入对话框","请输入条目",item);qDebug() << body;
}

运行效果如下:


 

文件对话框 QFiledialog

在Qt中,QFiledialog是一个用于打开和保存文件的对话框类。它提供了一个标准的界面,让用户可以浏览文件系统、选择文件或目录,并执行打开或保存操作,其次QFiledialog也模态的。

常用方法介绍:

  • 1、打开文件(⼀次只能打开⼀个文件)
QString getOpenFileName(QWidget* parent = nullptr,const QString &caption = QString(),constQString &dir = QString(),constQString &filter= QString(),QString*selectedFilter = nullptr,QFileDialog::Optionsoptions = Options()
)

示例1:打开文件

 QString file = QFileDialog::getOpenFileName(this,  //父亲"文件", //文件对话框标题"D:\\c++ Learning\\qt\\code\\Qt window\\QFileDialog\\untitled",//打开路径"*.cpp" //打开文件格式);qDebug() << file;

 运行效果如下:

  •  2、打开多个文件(⼀次可以打开多个文件)
QStringList getOpenFileNames(QWidget *parent=nullptr,const QString &caption=QString(),const QString &dir=QString(),const QString &filter=QString(),QString *selectedFilter=nullptr,QFileDialog::Optionsoptions=Options()
)
  • 3、保存文件
QString getSaveFileName(QWidget*parent=nullptr,constQString &caption=QString(),const QString &dir=QString(),const QString &filter=QString(),QString *selectedFilter=nullptr,QFileDialog::Options options=Options()
)参数说明:
参数1:parent ⽗亲
参数2:caption 对话框标题
参数3:dir 默认打开的路径
参数4:filter ⽂件过滤器

总结

在Qt中,对话框是用于与用户进行交互的特殊窗口,通常用于输入数据、显示信息或进行设置。对话框可以是模态的也可以是非模态的。

主要特点:

1.模态对话框(Modal Dialogs)

  • 阻塞父窗口,直到对话框关闭。
  • 通常用于需要用户立即响应的情况,如确认操作、输入数据等。
  • 在Qt中,可以使用Dialogs类创建模态对话框。

2.非模态对话框(Non-modal Dialogs)

  • 不阻塞父窗口,用户可以同时与父窗口和其他非模态对话框交互。
  • 适用于不需要立即响应的辅助窗口,如状态显示、日志查看等。

创建对话框:

  • 继承QDialog:创建自定义对话框时,通常需要继承QDialog类,并在其中定义所需的界面元素和逻辑。
  • 使用预定义对话框:Qt提供了一系列预定义的对话框类,如QFileDialog(文件选择)、QColorDialog(颜色选择)、QMessageBox(消息提示)等,可以直接使用这些类来实现常见的对话框功能。

这篇关于【Qt窗口】—— 对话框的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124862

相关文章

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二