【Qt窗口】—— 对话框

news2024/11/23 11:43:30

目录

(一) 对话框介绍

(二)对话框的分类

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 MessageBox
    MessageBox->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::WindowFlags
    flags=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(消息提示)等,可以直接使用这些类来实现常见的对话框功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3588 系列之1—串口连接

RK3588 系列之1—串口连接 1.串口转USB芯片驱动2.使用MobaXterm进行串口链接3.注意事项 1.串口转USB芯片驱动 根据使用的芯片安装不同的驱动&#xff0c;常见的如CH340。装完驱动后&#xff0c;通过设备管理器&#xff0c;查看开发板与个人PC连接情况&#xff0c;记住占用的端…

超声波智能水表通讯方式有哪些?

超声波智能水表采用多种通讯方式实现数据传输&#xff0c;包括但不限于有线连接、无线网络、以及短距离无线通信技术&#xff0c;这些方式各有优劣&#xff0c;适用于不同的应用场景。 一、通讯方式概述 1.有线通讯 -RS-485接口&#xff1a;这是一种半双工的串行通信接口标准…

微服务框架二

微服务 微服务技术栈 服务发现概念 服务发现两种方式 客户端发现 服务端服务发现 服务发现技术对比 Nacos架构图 基于dubbo nacos服务调用 Nacos核心源码解析 registery 具体实现在nacosServiceRegistery setbeat 返回clientBeatInterval

cannot import name ‘greycomatrix‘ from ‘skimage.feature.texture‘ 解决方法

症状&#xff1a; ImportError: cannot import name ‘greycomatrix’ from ‘skimage.feature’ (D:\ProgramData\anaconda3\Lib\site-packages\skimage\feature_init_.py) 解决方案 将涉及的grey全部替换为gray即可

黑神话·悟空亢金龙怎么打?亢金龙全攻略

走到湖心庙宇&#xff0c;长得像弥勒缩小版的小和尚出现了。 他为师为师的叫着&#xff0c;似乎还想收天命人为徒&#xff0c;跟着他修行似得。 不过&#xff0c;他身上的乾坤袋出卖了自己&#xff0c;不是黄眉大仙是谁? 不知为何&#xff0c;曾经从金铙里救出悟空的亢金龙居…

Minkowski分形电路生成工具[程序附后]

此工具用于生成Minkowski分形电路&#xff0c;应用领域可参考分形电路的纪录片或CNKI论文。运行环境在Altium Designer中&#xff0c;可用于Altium Designer全系列的版本中。 程序界面如下图所示&#xff0c;可以支持外框和迭代次数的更改。 程序下载链接&#xff1a; Minkows…

加载:loader实现

1、利用内联汇编显示字符串 通过反复调用BIOS显示字符的方式来显示一个完整的字符串&#xff0c;该功能将用于loader在初始化过程中显示初始化进度、错误信息。 具体代码 // 16位代码&#xff0c;必须加上放在开头&#xff0c;以便有些io指令生成为32位 __asm__(".code…

STM32外设SPI(串行通信),W25Q64(8Mb)

1 非易失存储器:E2PROM,FLASH(断电不丢失) 2 易失存储器&#xff1a;SRAM,DRAM 3 W25Q64 1 从00 00 00 到 7F FF FF 2 block(块)&#xff0c;sector(扇区) &#xff0c;page&#xff08;页区&#xff09; 写数据到FLASH&#xff08;256字节&#xff09; 读数据很快&#…

002.Python爬虫系列_初识协议

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

论文学习哇

2024.7.18 1.A gated cross-domain collaborative network for underwater object detection 对图像进行增强 摘要&#xff1a;水下存在低对比度和低光的问题&#xff0c;有的学者通过水下图像增强来提高图片质量&#xff0c;但会移除或者改变水下物体的细节。所以作者探索两…

【Android】使用 ADB 查看 Android 设备的 CPU 使用率

目录 一 查看整体CPU使用率 1 top 二 查看特定应用的CPU使用率 1 获取特定应用的进程 ID (PID) 2 使用 top 命令并过滤该 PID 三 常见的CPU相关命令参数 1 adb shell top 参数 一 查看整体CPU使用率 1 top top命令将显示当前所有进程的 CPU 使用情况&#xff0c;包括每…

Codeforces Round 969 (Div. 2) 题ABC详细题解,包含(C++,Python语言描述)

前言&#xff1a; 首先让我们恭喜tourist创造历史 他是第一&#xff0c;他又是第一&#xff0c;他总是第一&#xff0c;第一个codefores上4000分的&#xff0c;创造一个新的段位:Tourist&#xff0c;他的名字就是一个新的段位&#xff0c;他就是最高的山&#xff0c;最长的河 本…

shell脚本--正则表达式

一、正则表达式的类型 在Linux中,有两种流行的正则表达式引擎: POSIX基础正则表达式(basic regular expression,BRE)引擎 POSIX扩展正则表达式(extended regular expression,ERE)引擎 POSIX BRE引擎通常出现在依赖正则表达式进行文本过滤的编程语言中。它为常见模式提供…

蓝牙对象交换协议(OBEX) - 常见的opcode介绍

零.声明 本专栏文章我们会以连载的方式持续更新&#xff0c;本专栏计划更新内容如下&#xff1a; 第一篇:蓝牙综合介绍 &#xff0c;主要介绍蓝牙的一些概念&#xff0c;产生背景&#xff0c;发展轨迹&#xff0c;市面蓝牙介绍&#xff0c;以及蓝牙开发板介绍。 第二篇:Trans…

六、vue进阶知识点

一、scoped解决样式冲突 默认情况:写在组件中的样式会 全局生效→ 因此很容易造成多个组件之间的样式冲突问题。 1.全局样式:默认组件中的样式会作用到全局 2.局部样式:可以给组件加上 scoped 属性,可以让样式只作用于当前组件scoped原理? 1.当前组件内标签都被添加 data-v-…

【C++从练气到飞升】17---set和map

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书&#x1f389; 目录 ⛳️推荐 一、前言 1.1 关联式容器 1.2 键值对 1.3 树型结构的关联式容器 二、set 2.1 set的介绍 2.2 s…

百元蓝牙耳机品牌哪个牌子好?入围四大排名蓝牙耳机推荐

蓝牙耳机有两个极端&#xff0c;好用的蓝牙耳机音质效果堪比专业音响&#xff0c;而不好用的则不仅佩戴不舒服还容易伤耳&#xff0c;但是想要找到一款性价比高的百元蓝牙耳机不是一件容易的事。百元蓝牙耳机品牌哪个牌子好&#xff1f;身为一名蓝牙耳机发烧友&#xff0c;就给…

红石电路(我的世界)

红石电路&#xff08;Redstone circuits&#xff09;为玩家建造的&#xff0c;可以用于控制或激活其他机械的结构。 电路本身既可以被设计为用于响应玩家的手动激活&#xff0c;也可以让其自动工作——或是反复输出信号&#xff0c;或是响应非玩家引发的变化&#xff0c;例如生…

基于机器学习的商品评论情感分析

从淘宝爬取评论 使用Selenium模拟真实登录行为&#xff0c;并爬取数据。 数据清理 如果文本中有“666“&#xff0c;”好好好“等无用词语&#xff0c;去掉评论中的标点符号。 分词 使用jieba精确模式进行分词&#xff0c;构造词典 将词汇向量化 创建词语字典&#xff0c;并…

视频:Python深度学习量化交易策略、股价预测:LSTM、GRU深度门控循环神经网络|附代码数据...

全文链接&#xff1a;https://tecdat.cn/?p37539 分析师&#xff1a;Shuo Zhang 本文以上证综指近 22 年的日交易数据为样本&#xff0c;构建深度门控循环神经网络模型&#xff0c;从股价预测和制定交易策略两方面入手&#xff0c;量化循环神经网络在股票预测以及交易策略中的…