16 对话框QDialog

QDialog是所有对话框的基类

模态,非模态和半模态对话框 

模态(Modal)对话框:就是在我们没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互,比如新建项目时弹出的对话框。

要想使一个对话框成为模态对话框,只需要调用它的exec()函数:

QDialog dialog(this);
dialog.exec();

非模态(Modeless)对话框:既可以与它交互,也可以与同一程序中的其他窗口交互,例如Microsoft Word中的查找替换对话框。

要使一个对话框成为非模态对话框,我们就可以使用new操作来创建,然后使用show()函数来显示。

QDialog *dialog = new QDialog(this);
dialog->show();

或者:

    QDialog *dialog = new QDialog(this);
    dialog->setModal(false);
    dialog->show();

半模态对话框:我们没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互,但是程序自己会继续运行。

    QDialog *dialog = new QDialog(this);
    dialog->setModal(true);
    dialog->show();

更多内容参考我的博客:

https://blog.csdn.net/qq_40732350/article/details/86602996

模态和半模态都属于模态,但是,模态的效果和半模态不一样的。

这是因为调用完show()函数后会立即将控制权交给调用者,那么程序可以继续往下执行。

而调用exec()函数却不是这样,它只有当对话框被关闭时才会返回。    

与setModal()函数相似的还有一个setWindowModality()函数,它有一个参数来设置模态对话框要阻塞的窗口类型,可以是:

Qt::NonModal(不阻塞任何窗口,就是非模态)

Qt::WindowModal(阻塞它的父窗口和所有祖先窗口以及它们的子窗口)

Qt::ApplicationModal(阻塞整个应用程序的所有窗口)。    

而setModal()函数默认设置的是Qt::ApplicationModal。

 

多窗口切换

信号和槽

参考我的博客:

https://blog.csdn.net/qq_40732350/article/details/86618065

void MyDialog::on_pushButton_clicked()
{
    accept();
}

accept()函数是QDialog类中的一个槽,对于一个使用exec()函数实现的模态对话框,执行了这个槽就会隐藏这个模态对话框,并返回QDialog::Accepted值。这里就是要用这个值来判断是哪个按钮被按下。

对应的还有reject()槽,表示拒绝。

标准对话框

Qt提供了一些常用的对话框类型,它们全部继承自QDialog类,并增加了自己的特色功能,比如获取颜色、显示特定信息等。

1 颜色对话框

void MyWidget::on_pushButton_clicked()
{
    QColor color = QColorDialog::getColor(Qt::red, this, tr("颜色对话框"),
                                              QColorDialog::ShowAlphaChannel);
    qDebug() << "color: " << color;
}

这里使用了QColorDialog的静态函数getColor()来获取颜色,它的三个参数的作用分别是:设置初始颜色、父窗口和对话框标题。这里的Qt::red,是Qt预定义的颜色对象。

运行结果:

输出结果:

color:  QColor(ARGB 1, 1, 0, 0)

ARGB:对应透明度(alpha),红色(red),绿色(green),蓝色(blue)。

上面只是用的静态函数,如果想要更灵活的设置时,可以先创建对象,然后进行各项设置:

void MyWidget::on_pushButton_clicked()
{
    QColorDialog dialog(Qt::red, this);                // 创建对象
    dialog.setOption(QColorDialog::ShowAlphaChannel); // 显示alpha选项
    dialog.exec();                                    // 以模态方式运行对话框
    QColor color = dialog.currentColor();             // 获取当前颜色

    qDebug() << "color: " << color;
}

运行结果:

2 文件对话框

void MyWidget::on_pushButton_2_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"),
                "D:", tr("图片文件(*png *jpg)"));
    qDebug() << "fileName:" << fileName;
}

这里使用了QFileDialog类中的getOpenFileName()函数来获取选择的文件名,这个函数会以模态方式运行一个文件对话框。打开后选择一个文件,单击“打开”按钮后, ,这个函数便可以返回选择的文件的文件名。

它的4个参数的作用分别是:指定父窗口、设置对话框标题、指定默认打开的目录路径和设置文件类型过滤器。

如果不指定文件过滤器,则默认选择所有类型的文件。这里指定了只选择png和jpg两种格式的图片文件(注意,代码中* png和*jpg之间需要一个空格),那么在打开的文件对话框中只 ,能显示目录下这两种格式的文件。还可以设置多个不同类别的过滤器,不同类别间使用两个分号“;"隔开,例如,添加文本文件类型:

void MyWidget::on_pushButton_2_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"),
                "D:", tr("图片文件(*png *jpg);;文本文件(*txt)"));
    qDebug() << "fileName:" << fileName;
}

这时再次运行程序,就可以在文件对话框的文件类型中选择“文本文件”类型了。前面这个程序只能选择单个文件,要同时选择多个文件,则可以使用getOpen FileNames()函数,例如:

void MyWidget::on_pushButton_2_clicked()
{
    QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("文件对话框"),
                                                          "G:", tr("图片文件(*png *jpg)"));
    qDebug()<< "fileNames:" << fileNames;
}

3 字体对话框

void MyWidget::on_pushButton_3_clicked()
{
    // ok用于标记是否按下了“OK”按钮
    bool ok;
    QFont font = QFontDialog::getFont(&ok, this);
    // 如果按下“OK”按钮,那么让“字体对话框”按钮使用新字体
    // 如果按下“Cancel”按钮,那么输出信息
    if (ok) ui->pushButton_3->setFont(font);
    else qDebug() << tr("没有选择字体!");
}

设置前:

选择字体:

运行结果:

4 输入对话框

void MyWidget::on_pushButton_4_clicked()
{
    bool ok;
    // 获取字符串
    QString string = QInputDialog::getText(this, tr("输入字符串对话框"),
                                           tr("请输入用户名:"), QLineEdit::Normal,tr("admin"), &ok);
    if(ok) qDebug() << "string:" << string;
    // 获取整数
    int value1 = QInputDialog::getInt(this, tr("输入整数对话框"),
                                      tr("请输入-1000到1000之间的数值"), 100, -1000, 1000, 10, &ok);
    if(ok) qDebug() << "value1:" << value1;
    // 获取浮点数
    double value2 = QInputDialog::getDouble(this, tr("输入浮点数对话框"),
                                            tr("请输入-1000到1000之间的数值"), 0.00, -1000, 1000, 2, &ok);
    if(ok) qDebug() << "value2:" << value2;
    QStringList items;
    items << tr("条目1") << tr("条目2") << tr("条目3");
    // 获取条目
    QString item = QInputDialog::getItem(this, tr("输入条目对话框"),
                                         tr("请选择或输入一个条目"), items, 0, true, &ok);
    if(ok) qDebug() << "item:" << item;
}

这里一共创建了4个不同类型的输人对话框。

getText()函数可以提供一个可输入字符串的对话框,各参数的作用分别是:指定父窗口、设置窗口标题、设置对话框中的标签显示文本、设置输入字符串的显示模式(例如密码可以显示成小黑点,这里选择了显示用户输人的实际内容)、设置输入框中的默认字符串和设置获取按下按钮信息的 bool变量;

getInt()函数可以提供一个输入整型数值的对话框,其中的参数100表示默认的数值是100,-1000表示可输入的最小值是-1000, 1 000表示可输入的最大值是 11 000,10表示使用箭头按钮,数值每次变化10;

getDouble()函数可以提供一个输入浮点型数值的对话框,其中的参数2表示小数的位数为2;

getItem ()函数提供一个可以输入一个条目的对话框,需要先给它提供一些条目,例如这里定义的QStringList类型的 items,其中参数0表示默认显示列表中的第0个条目(0就是第一个),参数true设置条目是否可以被更改,true就是可以被更改。这里使用了静态函数,不过也可以自己定义对象,然后使用相关的函数进行设置。

5 消息对话框

void MyWidget::on_pushButton_5_clicked()
{
    // 问题对话框
    int ret1 = QMessageBox::question(this, tr("问题对话框"),
                                     tr("你了解Qt吗?"), QMessageBox::Yes, QMessageBox::No);
    if(ret1 == QMessageBox::Yes) qDebug() << tr("问题!");
    // 提示对话框
    int ret2 = QMessageBox::information(this, tr("提示对话框"),
                                        tr("这是Qt书籍!"), QMessageBox::Ok);
    if(ret2 == QMessageBox::Ok) qDebug() << tr("提示!");
    // 警告对话框
    int ret3 = QMessageBox::warning(this, tr("警告对话框"),
                                    tr("不能提前结束!"), QMessageBox::Abort);
    if(ret3 == QMessageBox::Abort) qDebug() << tr("警告!");
    // 错误对话框
    int ret4 = QMessageBox::critical(this, tr("严重错误对话框"),
                                     tr("发现一个严重错误!现在要关闭所有文件!"), QMessageBox::YesAll);
    if(ret4 == QMessageBox::YesAll) qDebug() << tr("错误");
    // 关于对话框
    QMessageBox::about(this, tr("关于对话框"),
                       tr("致力于Qt及Qt Creator的普及工作!"));
}

运行结果:

6 进度对话框

void MyWidget::on_pushButton_6_clicked()
{
    bool Canceled = false;
    QProgressDialog dialog(tr("文件复制进度"), tr("取消"), 0, 50000, this);
    dialog.setWindowTitle(tr("进度对话框"));     // 设置窗口标题
    dialog.setWindowModality(Qt::WindowModal);  // 将对话框设置为模态
    dialog.show();
    for(int i=0; i<50000; i++) {                // 演示复制进度
        dialog.setValue(i);                     // 设置进度条的当前值
        QCoreApplication::processEvents();      // 避免界面冻结
        if(dialog.wasCanceled()){               // 按下取消按钮则中断
            Canceled = true;
            break;
        }
    }
    dialog.setValue(50000);    // 这样才能显示100%,因为for循环中少加了一个数
    if(Canceled)
        qDebug() << tr("复制失败!");
    else
        qDebug() << tr("复制成功!");
}

这里首先创建了一个QProgressDialog类对象dialog,构造函数的参数分别用于设置对话框的标签内容、取消按钮的显示文本、最小值、最大值和父窗口。

然后将对话框设置为模态并进行显示。for()循环语句模拟了文件复制过程, setValue()函数使进度条向前推进;为了避免长时间操作而使用户界面冻结,必须不断地调用QCoreApplica tion类的静态函数processEvents (),可以将它放在for()循环语句中。使用QPro gressDialog的wasCanceled()函数来判断用户是否按下了“取消”按钮,如果是,则中断复制过程。

这里使用了模态对话框,QProgressDialog还可以实现非模态对话框,不过它需要定时器等的帮助。这里首先创建了一个QProgressDialog类对象dialog,构造函数的参数分别用于设置对话框的标签内容、取消按钮的显示文本、最小值、最大值和父窗口。然后将对话框设置为模态并进行显示。

for()循环语句模拟了文件复制过程, setValue()函数使进度条向前推进;为了避免长时间操作而使用户界面冻结,必须不断地调用QCoreApplica tion类的静态函数processEvents (),可以将它放在for()循环语句中。使用QPro gressDialog的wasCanceled()函数来判断用户是否按下了“取消”按钮,如果是,则中断复制过程。这里使用了模态对话框,QProgressDialog还可以实现非模态对话框,不过它需要定时器等的帮助。

7 错误信息对话框 

先在mywidget.h中添加类声明:

class QErrorMessage;

然后添加私有对象:

QErrorMessage *errordlg;

然后在构造函数中添加:

errordlg = new QErrorMessage(this);

然后槽为:

void MyWidget::on_pushButton_7_clicked()
{
    errordlg->setWindowTitle(tr("错误信息对话框"));
    errordlg->showMessage(tr("这里是出错信息!"));
}

运行结果:

这里首先新建了一个QErrorMessage对话框,并且调用它的showMessage()函数来显示错误信息,调用这个函数时对话框会以非模态的形式显示出来。

错误信息对话框中默认有一个Show this message again复选框,可以选择以后是否还要显示相同错误信息;为了这个复选框的功能有效,不能像前面几个例子一样在槽中直接创建对话框。

8 向导对话框

类定义中添加:

    QWizardPage *createPage1();        // 向导第一页
    QWizardPage *createPage2();        // 向导第二页
    QWizardPage *createPage3();        // 向导第三页

对应的槽:

QWizardPage * MyWidget::createPage1()  // 向导页面1
{
    QWizardPage *page = new QWizardPage;
    page->setTitle(tr("介绍"));
    return page;
}
QWizardPage * MyWidget::createPage2()  // 向导页面2
{
    QWizardPage *page = new QWizardPage;
    page->setTitle(tr("用户选择信息"));
    return page;
}
QWizardPage * MyWidget::createPage3()  // 向导页面3
{
    QWizardPage *page = new QWizardPage;
    page->setTitle(tr("结束"));
    return page;
}

// 向导对话框
void MyWidget::on_pushButton_8_clicked()
{
    QWizard wizard(this);
    wizard.setWindowTitle(tr("向导对话框"));
    wizard.addPage(createPage1());     // 添加向导页面
    wizard.addPage(createPage2());
    wizard.addPage(createPage3());
    wizard.exec();
}

添加向导页面的顺序和向导实际页面的顺序是一致的。

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值