QT--信号与槽(3) 标准对话框

x33g5p2x  于2021-12-06 转载在 其他  
字(8.4k)|赞(0)|评价(0)|浏览(396)

QT–信号与槽(3)标准对话框

新建一个项目Qt Widgets,类选择Qwidgte,类名MyWidget。完成后ui设计

1.颜色对话框 QColorDialog

现在mywidget.cpp中添加 #include < QDebug> 和 #include< QColorDialog>头文件,然后从设计模式进入"颜色对话框“按钮的clicked()单击信号槽,更改:

  1. void MyWidget::on_pushButton_clicked()
  2. {
  3. QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"));
  4. qDebug()<<"color:"<<color;
  5. }

遇到不会的就按F1查帮助

借用QColorDialog::getColor方法
它的三个参数分别是:设置初始颜色、指定父窗口、设置对话框标题
这里的Qt::red是Qt内置的颜色对象,ennum Qt::GlobalColor

getColor返回一个QColor类型数据。
qDebug输出颜色信息

选好颜色,点击确定,qDebug输出颜色信息

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

这里的4个值分别代表透明度(alpha)、红色®、绿色(g)、蓝色(blue) 三原色

数值为0.0~~1.0,也可以用0 ~255来表示
这二者之间也有简单的转换
0对应0.0,255对应1.0 一个精度1/255

在颜色对话框中还可以添加对alpha的设置,就是在getColor()函数中再使用最后一个参数:

  1. QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"),QColorDialog::ShowAlphaChannel);

QColorDialog::ShowAlphaChannel

用来显示alpha设置。可以运行程序

多出来个alpha设置

上面的是用QColorDialog的静态函数来显示颜色对话框,如果你想创建对象,更灵活的设置,则可以先创建对象

  1. void MyWidget::on_pushButton_clicked()
  2. {
  3. /*静态方法*/
  4. //QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"),QColorDialog::ShowAlphaChannel);
  5. /*创建对象*/
  6. QColorDialog dialog(Qt::red,this); //创建对象
  7. dialog.setOption(QColorDialog::ShowAlphaChannel); //显示alpha选项
  8. dialog.exec(); //以模态方式运行对话框
  9. QColor color =dialog.currentColor(); //获取当前颜色
  10. qDebug()<<"color:"<<color;
  11. }

2 文件对话框 QFileDialog

文件对话框
添加头文件#include< QFileDialog>
然后从ui界面转到“文件对话框“的槽

  1. //文件对话框的槽
  2. void MyWidget::on_pushButton_2_clicked()
  3. {
  4. QString fileName=QFileDialog::getOpenFileName(this,tr("文件对话框"),"D:",tr("图片文件(*png *jpg)"));
  5. }

这里使用了QFileDialog的getOpenFileName函数
可以crtl点击转到那个函数,

也可以f1帮助,反正这二条都可以帮你看
随后
getOpenFileName这个函数会以模态方式运行一个文件对话框。打开后返回选择的文件名

  1. QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
  2. "/home",
  3. tr("Images (*.png *.xpm *.jpg)"));

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

  1. getOpenFileName(this,tr("文件对话框"),"D:",tr("图片文件(*png *jpg)"));

如果不设置过滤器,则默认选择全部类型的文件

这里只选择了png 和 jpg文件格式的

除此,还可以设置多个不同类型的过滤器,用;;隔开
例如:添加txt类型

  1. getOpenFileName(this,tr("文件对话框"),"D:",tr("图片文件(*png *jpg);;文本文件(*txt)"));

然后加上qDebug()输出信息

  1. //文件对话框的槽
  2. void MyWidget::on_pushButton_2_clicked()
  3. {
  4. QString fileName=QFileDialog::getOpenFileName
  5. (this,tr("文件对话框"),"D:",tr("图片文件(*png *jpg);;文本文件(*txt)"));
  6. qDebug()<< "fileName:" << fileName;
  7. }

选择一个d盘的照片

这时候加上txt就可以选择txt文件

前面那个程序智能选择一个文件,如果要选择多个文件
就跟英语复数一样,加个s就行,用函数getOpenFileNames

  1. //文件对话框的槽
  2. void MyWidget::on_pushButton_2_clicked()
  3. {
  4. QStringList fileNames=QFileDialog::getOpenFileNames
  5. (this,tr("文件对话框"),"D:",tr("图片文件(*png *jpg);;文本文件(*txt)"));
  6. qDebug()<< "fileNames:" << fileNames;
  7. }

多个文件名存放在QStringList类型变量中。
QStringList官方:https://doc.qt.io/qt-5/qstringlist.html

当然也可以不使用这些静态函数,而是建立对话框对象来操作。

  1. //文件对话框的槽
  2. void MyWidget::on_pushButton_2_clicked()
  3. {
  4. // QStringList fileNames=QFileDialog::getOpenFileNames(this,tr("文件对话框"),"D:",tr("图片文件(*png *jpg);;文本文件(*txt)"));
  5. QFileDialog dialog1(this);
  6. //qDebug()<< "fileNames:" << fileNames;
  7. QStringList fileNames= dialog1.getOpenFileNames
  8. (this,tr("文件对话框"),"D:",tr("图片文件(*png *jpg);;文本文件(*txt)"));
  9. qDebug()<< "fileNames:" << fileNames;
  10. }

除了getOpenFilename外还有其他的函数
QFileDialog 类还提供了getSaveFilename()函数来实现保存文件对话框和文件另存为对话框

  1. QString fileName = QFileDialog :: getSaveFileName( this , tr( "Save File" ) ,
  2. "/home/jana/untitled.png" ,
  3. tr( "Images (*.png *.xpm *.jpg)" ));

dialog1.getSaveFileName(this,tr("文件保存"),"C:/QtCode",tr("图片文件(*png *jpg)"));
类似这样
还可以getExistingDirectory();//获取文件路径

类似用法都可以看帮助等,与上面的差不多

3.字体对话框 QFontDialog

先添加#include < QFontDialog>头文件,然后转到“字体对话框“按钮的转到槽,到它的槽函数

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

4. 输入对话框 QInputDialog

输人对话框QInputDialog类用来提供一个对话框,可以让用户输人一个单一的数值或字符串。

先添加头文件#include < QInputDialog>,然后转到槽

  1. void MyWidget::on_pushButton_4_clicked()
  2. {
  3. bool ok;
  4. // 获取字符串
  5. //QLineEdit::Normal是开始的默认值 tr->admin
  6. QString string = QInputDialog::getText
  7. (this, tr("输入字符串对话框"), tr("请输入用户名:"),
  8. QLineEdit::Normal,tr("admin"), &ok);
  9. if(ok) qDebug() << "string:" << string;
  10. // 获取整数
  11. //括号里面的值分别是:默认值,最小值,最大值,每次10个加减变化
  12. int value1 = QInputDialog::getInt(this, tr("输入整数对话框"),
  13. tr("请输入-1000到1000之间的数值"),
  14. 100, -1000, 1000, 10, &ok);
  15. if(ok) qDebug() << "value1:" << value1;
  16. // 获取浮点数
  17. //括号里面的值分别是:默认值,最小值,最大值,2表示小数的位数为2
  18. double value2 = QInputDialog::getDouble
  19. (this, tr("输入浮点数对话框"),tr("请输入-1000到1000之间的数值"),
  20. 0.00, -1000, 1000, 2, &ok);
  21. if(ok) qDebug() << "value2:" << value2;
  22. QStringList items;
  23. items << tr("条目1") << tr("条目2");
  24. // 获取条目
  25. //上面已经提供条目了,12
  26. //0表示默认是第一个条目,参数true设置条目是否可以被更改,true就是可以被更改。
  27. QString item = QInputDialog::getItem
  28. (this, tr("输入条目对话框"),tr("请选择或输入一个条目"), items, 0, true, &ok);
  29. if(ok) qDebug() << "item:" << item;
  30. //这里使用的是静态函数,也可以把上面的换为对象
  31. }

解释都在注释里,按f1看帮助

5. 消息对话框 QMessageBox

消息对话框QMessageBox类提供了一个模态的对话框来通知用户一些信息,或者向用户提出一个问题并且获取答案。
先添加头文件#include < QMessageBox>,然后转到槽

  1. void MyWidget::on_pushButton_5_clicked()
  2. {
  3. // 问题对话框
  4. int ret1 = QMessageBox::question(this, tr("问题对话框"),
  5. tr("你了解Qt吗?"), QMessageBox::Yes, QMessageBox::No);
  6. if(ret1 == QMessageBox::Yes) qDebug() << tr("问题!");
  7. // 提示对话框
  8. int ret2 = QMessageBox::information(this, tr("提示对话框"),
  9. tr("这是Qt书籍!"), QMessageBox::Ok);
  10. if(ret2 == QMessageBox::Ok) qDebug() << tr("提示!");
  11. // 警告对话框
  12. int ret3 = QMessageBox::warning(this, tr("警告对话框"),
  13. tr("不能提前结束!"), QMessageBox::Abort);
  14. if(ret3 == QMessageBox::Abort) qDebug() << tr("警告!");
  15. // 错误对话框
  16. int ret4 = QMessageBox::critical(this, tr("严重错误对话框"),
  17. tr("发现一个严重错误!现在要关闭所有文件!"), QMessageBox::YesAll);
  18. if(ret4 == QMessageBox::YesAll) qDebug() << tr("错误");
  19. // 关于对话框
  20. QMessageBox::about(this, tr("关于对话框"),
  21. tr("yafeilinux致力于Qt及Qt Creator的普及工作!"));
  22. }

这里创建了四个不同类型的消息对话框,分别拥有不同的图标和提示音(系统设置的),
几个参数分别用于设置父窗口,标题栏,显示信息和拥有的按钮。

这里使用的按钮都是QMessageBox类提供的标准按钮。

这几个静态函数的返回值就是那些标准按钮,由QMessageBox: : StandardButton枚举类型指定,可以使用返回值来判断用户按下了哪个按钮。

关于对话框—>about()函数没有返回值,因为它默认只有一个按钮,与其相似的还有一个aboutQt()函数,用来显示现在使用的Qt版本等信息。

如果想使用自定义的图标和按钮,那么可以创建QMessageBox类对象,然后使用相关函数进行操作。

6. 进度对话框 QProgressDialog

先添加 #include < QProgressDialog>头文件,然后转到槽

  1. void MyWidget::on_pushButton_6_clicked()
  2. {
  3. //(对话框的显示文本,取消按钮的显示文本,最小值,最大值,父窗口
  4. QProgressDialog dialog(tr("文件复制进度"), tr("取消"), 0, 50000, this);
  5. dialog.setWindowTitle(tr("进度对话框")); // 设置窗口标题
  6. dialog.setWindowModality(Qt::WindowModal); // 将对话框设置为模态 禁止父窗口
  7. dialog.show();
  8. for(int i=0; i<=50000; i++) { // 演示复制进度
  9. dialog.setValue(i); // 设置进度条的当前值
  10. QCoreApplication::processEvents(); // 避免界面冻结
  11. if(dialog.wasCanceled()) break; // 按下取消按钮则中断
  12. }
  13. qDebug() << tr("复制结束!");
  14. }

这里使用的是创造对象的方法,创建了一个QProgressDialog类对象dialog。

7. 错误信息对话框 QErrorMessage

显示错误信息的对话框
首先打开mywidget.h文件添加前置声明:
class QErrorMessage

然后添加私有对象QErrorMessage *errordlg;

下面到mywidget.cpp添加头文件#include< QErrorMessage>,并在构造函数中添加:
errordlg = new QErrorMessage(this);
然后转到槽

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

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

它默认有一个show this message again 复选框,可以选择以后是否还要显示相同错误

8. 向导对话框 QWizard

提供了一个设计向导界面的框架。比如安装软件时候的向导。

QWizard之所以被称为框架,是因为它具有设计一个向导全部的功能函数,可以使用它来实现想要的效果。

打开mywidget.h文件,然后添加头文件#include < QWizard>,在MyWidget类的声明中添加private类型函数声明:

  1. QWizardPage *createPage1();//新添加
  2. QWizardPage *createPage2();//新添加
  3. QWizardPage *createPage3();//新添加

这里的三个为QWizardPage类对象的指针函数,用来生成3个向导页面。
然后在mywidget.cpp文件中对这3个函数进行定义:

  1. /*向导对话框*/
  2. QWizardPage * MyWidget::createPage1() // 向导页面1
  3. {
  4. QWizardPage *page = new QWizardPage;
  5. page->setTitle(tr("介绍"));
  6. return page;
  7. }
  8. QWizardPage * MyWidget::createPage2() // 向导页面2
  9. {
  10. QWizardPage *page = new QWizardPage;
  11. page->setTitle(tr("用户选择信息"));
  12. return page;
  13. }
  14. QWizardPage * MyWidget::createPage3() // 向导页面3
  15. {
  16. QWizardPage *page = new QWizardPage;
  17. page->setTitle(tr("结束"));
  18. return page;
  19. }
  1. void MyWidget::on_pushButton_8_clicked()
  2. {
  3. QWizard wizard(this);
  4. wizard.setWindowTitle(tr("向导对话框"));
  5. wizard.addPage(createPage1()); // 添加向导页面
  6. wizard.addPage(createPage2());
  7. wizard.addPage(createPage3());
  8. wizard.exec();
  9. }

先新建了一个QWizard对象,然后使用addPage()函数为其添加了3个页面
直接调用了三个向导生成页面函数

相关文章