【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 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(消息提示)等,可以直接使用这些类来实现常见的对话框功能。
  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起飞的风筝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值