首页 > 其他分享 >Qt 对话框常见类型

Qt 对话框常见类型

时间:2024-04-10 21:04:01浏览次数:18  
标签:模态 Widget Qt 对话框 常见 ui QString QMessageBox

前言

        对话框是 GUI程序设计中不可或缺的组成部分,很多不能或者不适合放入主窗口的功能组件都必须放在对话框中。
        Qt使用 QDialog类实现对话框,通常会设计一个类继承 QDialog类。QDialog 类( 及其派生类,以及所有 Qt:Dialog 类型的类)对其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏有自己的位置,而非顶层窗口则会共享其父组件的位置。


模态和非模态对话框

        对话框分为模态对话框和非模态对话框。模态对话框会阻塞同一应用程序中其他窗口的输入。与此相反的是非模态对话框,则在进行一项“动作”时是不会阻塞同一引用程序其他窗口输入的。具体实现:

  • 使用 ODialog::exec()实现应用程序级别的模态对话框。
  • 使用 QDialog::open()实现窗口级别的模态对话框。
  • 使用 QDialog::show()实现非模态对话框。
  • QDialog::setAttribute()设置对话框属性,当为 Qt::WA DeleteOnClose 时,在对话框关闭时自我释放,不然不会自动销毁。

        用exec()方法来显示对话框时,总是以模态的形式来显示,关闭一个对话框,另一个对话框才能显示。 另一种是使用 show()方法,它使得对话框既可以模态显示,也可以非模态显示,决定它是模态还是非模态的是对话框的 Modal属性,而Modal有独特的属性。

        Modal属性:在默认的情况下时false,所以通过 show()方法显示的对话框就是非模态的。如果设置为true,就成了模态对话框。

a.模态对话框

Dialog w;
w.setModal(true);
w.show();
return a.exec();

b.非模态对话框

Dialog d
d.setModal(false);//不添加参数也默认为false
d.show()

对话框类型

        在Qt中的对话框大多是通用的。

Qt的内置对话框大致分为以下几类。

  • QColorDialog:选择颜色。
  • QFileDialog:选择文件或者目录。
  • QFontDialog:选择字体。
  • QInputDialog:允许用户输入一个值,并将该值返回。
  • QMessageBox:模态对话框,用于显示信息、询问问题等
  • QPageSetupDialog:为打印机提供纸张相关的选项。
  • QPrintDialog:打印机配置。
  • QPrintPreviewDialog:打印预览
  • QProgressDialog:显示操作过程

文件对话框 

        用一个例子:使用 QFileDialog 来打开一个文本文件,并将选择的文本的绝对路径和名称显示出来。在ui设计界面添加一个push button和plain text edit:

 右键单击按钮选择调转槽函数进行编写,其余自动生成的代码不变,在widget.cpp文件中:

#include "widget.h"    //在widget.h中引用了“QDir”和“QFileDialog”两个头文件
#include "ui_widget.h" 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_btnOpenFile_clicked()
{
    QString curPath=QDir::currentPath();// 获取程序当前日录 
    // 获取应用程序的路径
    QString dlgTitle="选择一个文件";// 对话框标题
    QString filter="文本文件 (*.txt); 图片文件 (*.jpg *.gif *.png);; 所有文件 (*.*)";// 文件过滤器
    QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
    if (!aFileName.isEmpty())
            ui->plainTextEdit->appendPlainText(aFileName);
}

 点击按钮后 弹出:

选择一个文件后,在可以编辑的plain text中:

 

        总结:若要打开一个文件,可调用静态函数 QFileDialog::getOpenFileName(),该函数需要传递 3个字符串型参数,分别如下:

  • 对话框标题,这里设置为“打开一个文件”。
  • 初始化目录,打开对话框时的初始目录,这里用 QDir::currentPath()获取应用程序当前目录。
  • 文件过滤器,设置选择不同扩展名的文件,可以设置多组文件,如:
QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png); 所有文件(*.*)”
  • 每组文件之间用两个分号隔开,同一组内不同文件之间用空格隔开。
  • QFileDialog::getOpenFileName()函数返回的是选择文件的带路径的完整文件名,如果在对话框里取消选择,则返回字符串为空。

 消息对话框

无交互对话框

接下来将介绍标准对话框 QMessageBox,即消息对话框的使用。QMessageBox用于显示提示消息,编程中一般会使用其提供的几个静态成员函数:

  • void about(QWidget * parent, const QSting & title, const QSting & text)用于显示关于对话框。这是一个比较简单的对话框,其标题是 title,内容是 text,父窗口是 parent。对话框只有一个“OK”按钮。
  • void aboutOt(QWidget* parent, const QString & title = QString())用于显示关于 Qt对话框该对话框用于显示有关 Qt 的信息。
  • StandardButton question(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButtonNoButton),这个对话框提供一个问号图标,其显示的按钮是“Yes”和“No”。
  • StandardButton warning(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton= NoButton),这个对话框提供一个黄色叹号图标。
  • StandardButton information(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButtonNoButton = NoButton),这个对话框提供一个蓝色 i 号图标。
  • StandardButton critical(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButtonNoButton = NoButton)这个对话框提供一个红色的 × 图标。

接下来就用一个例子简单测试一下这四个标准对话框,在ui设计界面:

右键单击对应的按钮选择调转槽函数进行编写,其余自动生成的代码不变,在widget.cpp文件中:

#include "widget.h"
#include "ui_widget.h"

#include <QDialog>
#include <QDir>
#include <QFileDialog>
#include <QColorDialog>
#include <QFontDialog>
#include <QInputDialog>
#include <QMessageBox>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_btnOpenFile_clicked()
{
    QString curPath=QDir::currentPath();// 获取程序当前日录
    // 获取应用程序的路径
    QString dlgTitle="选择一个文件";// 对话框标题
    QString filter="文本文件 (*.txt); 图片文件 (*.jpg *.gif *.png);; 所有文件 (*.*)";// 文件过滤器
    QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
    if (!aFileName.isEmpty())
            ui->plainTextEdit->appendPlainText(aFileName);
}

void Widget::on_button1_on_about_clicked()
{
    QString sTitle = "about对话框";
    QString sInfo = "简单提醒内容";
    QMessageBox::about(this,sTitle,sInfo);
}

void Widget::on_button2_on_aboutQt_clicked()
{
    QString sTitle = "aboutQt对话框";
    QMessageBox::aboutQt(this,sTitle);
}


void Widget::on_button3_on_question_clicked()
{
    QString sTitle = "question对话框";
    QString sInfo = "问题";
    QMessageBox::question(this,sTitle,sInfo,QMessageBox::Ok,QMessageBox::NoButton);
}


void Widget::on_button4_on_warning_clicked()
{
    QString sTitle = "warning对话框";
    QString sInfo = "警告内容";
    QMessageBox::warning(this,sTitle,sInfo,QMessageBox::Ok,QMessageBox::NoButton);
}

void Widget::on_button5_on_information_clicked()
{
    QString sTitle = "information对话框";
    QString sInfo = "一段信息";
    QMessageBox::information(this,sTitle,sInfo,QMessageBox::Ok,QMessageBox::NoButton);
}

void Widget::on_button6_on_critical_clicked()
{
    QString sTitle = "critical对话框";
    QString sInfo = "错误";
    QMessageBox::critical(this,sTitle,sInfo,QMessageBox::Ok,QMessageBox::NoButton);
}

 分别点击这六个按钮:

此时我们会发现,不同的对话框的弹出回伴随着不同音乐的演奏。

交互对话框

        我们发现上面列举的对话框只是单纯弹出一段信息,只要点击Ok按钮就行了,那我们怎么才能使用弹出的对话框返回值根据我们自己的选择呢?(用一个简单的示例来说明)

        在上面的例子里面,我们用question对话框,当我们在面对一个带问号的弹出的对话框时我们会对我们的操作进行确认或者取消:

在widget.cpp文件中添加(我们把选择的结果在右边可编辑的文字框里面显示出来!):

void Widget::on_button_on_jiaohu_clicked()
{
    QString sTitle = "question对话框";
    QString sInfo = "对你刚刚的操作,是否选择确认?";
    QMessageBox::StandardButton result;//记录所选择的按钮的值
    result = QMessageBox::question(this,sTitle,sInfo,QMessageBox::Yes|QMessageBox::No,QMessageBox::NoButton);
    if(result == QMessageBox::Yes){
        ui->plainTextEdit->appendPlainText("你选择了确认");
    }else if(result == QMessageBox::No){
        ui->plainTextEdit->appendPlainText("你选择了取消(关闭也是取消)");
    }else{
        ui->plainTextEdit->appendPlainText("你没选择");
    }
}

进行按钮示例: 

 

标签:模态,Widget,Qt,对话框,常见,ui,QString,QMessageBox
From: https://blog.csdn.net/atomy_iiii/article/details/137524569

相关文章

  • 【QT入门】Qt自定义控件与样式设计之QPushButton常用qss
    往期回顾【QT入门】Qt自定义控件与样式设计之qss介绍(Qtstylesheet)-CSDN博客【QT入门】Qt自定义控件与样式设计之qss选择器-CSDN博客【QT入门】Qt自定义控件与样式设计之QLineEdit的qss使用-CSDN博客 【QT入门】Qt自定义控件与样式设计之QPushButton常用qss这里我......
  • 【QT入门】 Qt自定义控件与样式设计之QCheckBox qss实现按钮开关
    往期回顾【QT入门】Qt自定义控件与样式设计之QPushButton常用qss-CSDN博客【QT入门】Qt自定义控件与样式设计之QPushButton实现鼠标悬浮按钮弹出对话框-CSDN博客【QT入门】Qt自定义控件与样式设计之QComboBox样式表介绍-CSDN博客 【QT入门】Qt自定义控件与样式设计之......
  • Qt使用Sqlite数据库-2
        上一篇文章介绍了sqlite数据库在Qt中基本使用方法(链接:Qt使用Sqlite数据库-1(入门级)-CSDN博客)。今天继续学习数据库常用的语法。1.删除数据库内容voiddeleteData(){QStringSql;//拼接sql语句Sql="DELETEFROMPerson_TableWHEREName='张......
  • 机器学习——常见模型评估指标
    目录一.模型评估综述1.1什么是模型评估1.2评估类型1.3模型泛化能力1.4过拟合与欠拟合1.4.1过拟合1.4.2欠拟合二.常见的分类模型评估方式2.1混淆矩阵2.2准确率(Accuracy)2.3精确率(Precision)2.4召回率(Recall)2.5F1-score2.6ROC曲线及AUC值2.7PR曲线三.PR曲线和ROC曲线的......
  • H.265视频直播点播录像EasyPlayer.js流媒体播放器用户常见问题及解答
    EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼容性强,使用非常便捷。今天我们来汇总下用户常见的几个问题及解答。1、EasyPlayer.js播放多路H.265视频时,CPU直接被占满该如何处理?答:因为H.265解码比较占......
  • MQTT协议特点及数据包结构详解(值得珍藏)
    点击下载《MQTT协议特点及数据包结构详解(值得珍藏)》1.前言MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,用极少的代码和有......
  • Linux清除记录的常见方式
    隐藏远程SSH登陆记录清除当前的history记录隐藏Vim的操作记录隐藏文件修改时间锁定文件清除系统日志痕迹1.隐藏远程SSH登陆记录隐身登录系统,不会被w、last等指令检测到。[email protected]/bin/bash-i-T表示不分配伪终端,/usr/bin/bash表示在登录后......
  • python收到MQTT消息后再发http请求
    python收MQTT消息和 发http请求的代码在前面的文章都有介绍,这里直接上完整的功能代码mqtt2http.py#python3.6importloggingimportrandomimporttimeimportrequests#frompaho.mqttimportclientasmqtt_clientimportpaho.mqtt.clientasmqttBROKER='......
  • python收到MQTT消息后写入mySQL
    python收MQTT消息和写mySQL的代码在前面的文章都有介绍,这里直接上完整的功能代码mqtt2mysql.py#python3.6importloggingimportrandomimporttimeimportmysql.connector#frompaho.mqttimportclientasmqtt_clientimportpaho.mqtt.clientasmqttBROKER......
  • Qt QCharts绘制柱状图,柱高和y轴数据刻度不匹配
    QCharts绘制柱状图,柱高和y轴数据刻度不匹配1//在项目pro文件中添加以下内容2QT+=charts34//在.h文件中添加以下内容,注意:需要将头文件及命名空间添加到ui命名空间之前,否则将提示错误5#include<QtCharts/QChartView>6#include<QtCharts/QBarSerie......