飞道的博客

C++ | Qt QDialog自定义对话框及标准对话框

310人阅读  评论(0)

目录

一、自定义对话框

二、标准对话框 

1.QMessageBox

自定义QMessageBox

2.QColorDialog

3.QFileDialog

4.QFontDialog

5.QInputDialog

6.QPageSetupDialog

7.QPrintDialog

8.QPrintPreviewDialog

9.QProgressDialog


一、自定义对话框

QDialog(及其子类,如QMessageDialog,以及所有Qt::Dialog类型的类)对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口;否则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。

对话框分为模态对话框和非模态对话框。

  • 模态对话框:会阻塞同一应用程序中其它窗口的输入,操作其他窗口前需要关闭该对话框。

1.使用QDialog::exec()实现应用程序级别的模态对话框【当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口】。

2.使用QDialog::open()实现窗口级别的模态对话框【该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。窗口级别的模态尤其适用于多窗口模式】。

  • 非模态对话框:允许在显示该对话框的同时,继续对其他窗口的内容进行编辑,如查找对话框。

1.使用QDialog::show()实现非模态对话框。


  
  1. //点击新建按钮,创建模态对话框
  2. connect(ui->actionnew,&QAction::triggered, this,[ this](){
  3. QDialog *dialog= new QDialog( this);
  4. //当主窗口不关闭,即不进行析构时,多次打开关闭对话框会导致内存泄漏
  5. dialog->setAttribute(Qt::WA_DeleteOnClose); //防止内存泄漏
  6. dialog->resize( 300, 200);
  7. dialog->setToolTip( "这是个ToolTip");
  8. dialog->setWindowIcon(QIcon( ":new/texture/Images/Sunny.jpg"));
  9. dialog->setWindowTitle( "原生对话框");
  10. dialog->exec();
  11. });
  12. //点击编辑按钮,创建非模态对话框
  13. connect(ui->actionedit,&QAction::triggered, this,[ this](){
  14. //在堆上创建dialog
  15. QDialog *dialog= new QDialog( this);
  16. dialog->setAttribute(Qt::WA_DeleteOnClose); //防止内存泄漏
  17. dialog->show();
  18. //在栈上创建dialog,一闪而过
  19. QDialog dialog1( this);
  20. dialog1.show();
  21. });

二、标准对话框 

标准对话框,是 Qt 内置的一系列对话框,用于简化开发。事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同,因此没有必要在每一个程序中都自己实现这么一个对话框。Qt 的内置对话框大致分为以下几类:

1.QMessageBox

QMessageBox是模态消息对话框,用于显示信息、询问问题等。


  
  1. QMessageBox::about( this, "关于对话框", "这时一个about对话框");
  2. QMessageBox::aboutQt( this, "Qt About");
  3. //严重错误对话框
  4. QMessageBox::critical( this, "错误", "这是个错误弹窗");
  5. //提问对话框 利用返回值判断用户按键类型
  6. if(QMessageBox::Save==QMessageBox::question( this, "提问", "要保存吗?",QMessageBox::Save|QMessageBox::No,QMessageBox::No)){
  7. //信息对话框
  8. QMessageBox::information( this, "提示", "保存成功");
  9. } else{
  10. //警告对话框
  11. QMessageBox::warning( this, "警告", "未保存");
  12. }

   

  

自定义QMessageBox


  
  1. QMessageBox *myBox= new QMessageBox( this);
  2. myBox->setIcon(QMessageBox::Information);
  3. myBox->setText( "我吹过你吹过的晚风~");
  4. myBox->setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);
  5. myBox->setDefaultButton(QMessageBox::Ok);
  6. myBox->addButton(QMessageBox::Save);
  7. myBox->setButtonText(QMessageBox::Ok, "确定");
  8. myBox->setWindowTitle( "歌词");
  9. myBox->setDetailedText( "详细信息:\n我吹过你吹过的晚风\n那我们算不算 相拥\n可如梦初醒般的两手空空\n心也空");
  10. myBox->setInformativeText( "描述信息:\n《错位时空》");
  11. int ret = myBox->exec();
  12. switch (ret)
  13. {
  14. case QMessageBox::Save:
  15. qDebug() << "Save!";
  16. break;
  17. case QMessageBox::Ok:
  18. qDebug() << "Ok!";
  19. break;
  20. case QMessageBox::Cancel:
  21. qDebug() << "cancel!";
  22. break;
  23. }

  

2.QColorDialog

 QColorDialog对话框是模态颜色对话框。


  
  1. //颜色对话框 第一个参数为默认选的颜色
  2. QColor color= QColorDialog::getColor(QColor( 255, 0, 0), this, "选择颜色",QColorDialog::ShowAlphaChannel);
  3. //修改label颜色
  4. QPalette palette;
  5. palette.setColor(QPalette::WindowText,color);
  6. ui->label->setPalette(palette);

3.QFileDialog

QFileDialog是选择文件对话框。If you want multiple filters, separate them with ';;':


  
  1. QString filepath= QFileDialog::getOpenFileName( this, "打开文件", "C:\\Users\\fengchujun\\Downloads", "txtFile(*.txt);;exeFile(*.exe)");
  2. qDebug()<<filepath;

  
  1. QAction *actionOpenFile= new QAction(QIcon( ":new/texture/Images/sunny.png"), "打开文件", this);
  2. QAction *actionSaveFile= new QAction(QIcon( ":new/texture/Images/butterfly.png"), "保存文件", this);
  3. QMenu *menu=menuBar()->addMenu( "操作文件");
  4. menu->addAction(actionOpenFile);
  5. menu->addAction(actionSaveFile);
  6. QTextEdit *edit= new QTextEdit( "文本框", this);
  7. setCentralWidget(edit);
  8. connect(actionOpenFile,&QAction::triggered, this,[=](){
  9. //文件对话框
  10. QString filepath= QFileDialog::getOpenFileName( this, "打开文件", "C:\\Users\\fengchujun\\Downloads", "*.txt");
  11. qDebug()<<filepath;
  12. if(filepath.isEmpty())
  13. {
  14. QMessageBox::warning( this, "提示", "您未选择文件");
  15. } else{
  16. QFile file(filepath);
  17. if( file.open(QIODevice::ReadOnly))
  18. {
  19. QTextStream in(&file);
  20. edit->setText(in.readAll());
  21. file.close();
  22. } else{
  23. QMessageBox::warning( this, "提示", "文件不可读");
  24. }
  25. }
  26. });
  27. connect(actionSaveFile,&QAction::triggered, this,[=](){
  28. //文件对话框
  29. QString filepath= QFileDialog::getOpenFileName( this, "打开文件", "C:\\Users\\fengchujun\\Downloads", "*.txt");
  30. qDebug()<<filepath;
  31. if(filepath.isEmpty())
  32. {
  33. QMessageBox::warning( this, "提示", "您未选择文件");
  34. } else{
  35. QFile file(filepath);
  36. if( file.open(QIODevice::WriteOnly))
  37. {
  38. QTextStream in(&file);
  39. in<< "helloworld";
  40. file.close();
  41. } else{
  42. QMessageBox::warning( this, "提示", "文件不可写");
  43. }
  44. }
  45. });

4.QFontDialog

QFontDialog是选择字体对话框。


  
  1. bool ok;
  2. QFont font= QFontDialog ::getFont(&ok,QFont( "黑体", 24), this, "选择字体");
  3. if(ok)
  4. {
  5. qDebug()<< "点击了OK";
  6. } else{
  7. qDebug()<< "点击了Cancel";
  8. }
  9. qDebug()<<font.family()<<font.pointSize()<<font.bold(); //字体 字号 是否加粗

5.QInputDialog

QInputDialog输入对话框,允许用户输入或者选择一个值(整数、浮点数、字符串、列表选项),并将其值返回。


  
  1. QInputDialog *inputDialog_int= new QInputDialog( this);
  2. bool getAge;
  3. int age= inputDialog_int->getInt( this, "输入年龄", "年龄", 22, 1, 110, 1,&getAge);
  4. if(getAge)
  5. {
  6. qDebug()<< "年龄:"<<age;
  7. }
  8. QInputDialog *inputDialog_item= new QInputDialog( this);
  9. QStringList list;
  10. list<<"春天"<<"夏天"<<"秋天"<<"冬天";
  11. bool getItem;
  12. QString season= inputDialog_item->getItem( this, "选择季节", "季节", list, 0, false,&getItem);
  13. if(getItem)
  14. {
  15. qDebug()<< "季节:"<<season;
  16. }
  17. QInputDialog *inputDialog_text= new QInputDialog( this);
  18. bool getInfo;
  19. QString info= inputDialog_text->getText( this, "密码", "输入密码",QLineEdit::Password, "",&getInfo);
  20. if(getInfo)
  21. {
  22. qDebug()<< "密码:"<<info;
  23. }

  

6.QPageSetupDialog

QPageSetupDialog为打印机提供纸张相关的选项。

注意:需要在.pro文件添加printsupport库:QT += printsupport


  
  1. QPrinter *printer= new QPrinter();
  2. QPageSetupDialog * pageSetUpDialog= new QPageSetupDialog(printer, this);
  3. if(pageSetUpDialog->exec()==QDialog::Accepted){
  4. int ret=printer->pageSize();
  5. QPrinter::ColorMode mode= printer->colorMode();
  6. QPageLayout layout=printer->pageLayout();
  7. qDebug()<< "纸张大小:"<<ret<< "颜色模式:"<<mode<<layout;
  8. }

7.QPrintDialog

QPrintDialog 打印机配置

8.QPrintPreviewDialog

QPrintPreviewDialog 打印预览;

9.QProgressDialog

QProgressDialog 进度条对话框。


  
  1. QProgressDialog *progressDialog= new QProgressDialog( "进度", "Cancel", 0, 100, this);
  2. int value= 0;
  3. progressDialog->setValue( 0);
  4. QPushButton *btn= new QPushButton( "控制进度条", this);
  5. connect(btn,&QPushButton::clicked, this,[=]() mutable{
  6. if(progressDialog->value()< 100)
  7. {
  8. value+= 10;
  9. progressDialog->setValue(value);
  10. }
  11. });
  12. progressDialog->exec();


转载:https://blog.csdn.net/weixin_39766005/article/details/117262991
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场