Qt浅谈之内置标准对话框

来源:互联网 发布:js json特殊字符处理 编辑:程序博客网 时间:2024/05/23 16:56

一、简介

       Qt提供了一套标准的通用对话框,极大的提高了使用者的开发效率。本文收集了大部分标准的对话框,用户需要使用时只须复制相应的部分代码就行,不用再到处查找。

二、运行图

三、详解

1、中文翻译

(1)内置对话框的翻译

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include <QTextCodec>  
  2. #include <QLibraryInfo>  
  3. #include <QLocale>  
  4. #include <QTranslator>  
  5. #include <QDebug>  
  6. {    
  7.     QString translatorFileName = QLatin1String("qt_");  
  8.     translatorFileName += QLocale::system().name();  
  9.     QTranslator *translator = new QTranslator(&app);  
  10.     if (translator->load(translatorFileName, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {  
  11.         app.installTranslator(translator);  
  12.     }  
  13. }  
也可以使用如下,更容易理解:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {  
  2.     bool bFinded = false;  
  3.     QString str = "QTDIR=/usr/share/qt4";  
  4.     str = str.mid(6);  
  5.     bFinded = translator.load("qt_" + QLocale::system().name(), str.append("/translations/"));  
  6.     if(bFinded) {  
  7.         qApp->installTranslator(&translator);  
  8.         qDebug() << QObject::tr("支持中文的Qt国际化翻译文件!");  
  9.     }  
  10.     else {  
  11.         qDebug() << QObject::tr("没有支持中文的Qt国际化翻译文件!");  
  12.     }  
  13. }  
(2)coder中文支持,出现乱码时可以切换

QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));     //Windows下

QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));              //Unix/Linux下

2、颜色对话框


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {      
  2.     QPalette palette = displayTextEdit->palette();  
  3.     const QColor& color = QColorDialog::getColor(palette.color(QPalette::Base), this);  
  4.     if(color.isValid()) {  
  5.         palette.setColor(QPalette::Base, color);  
  6.         displayTextEdit->setPalette(palette);  
  7.     }  
  8. }  

3、错误信息框

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {  
  2.      QErrorMessage box(this);  
  3.      box.setWindowTitle(tr("错误信息框"));  
  4.      box.showMessage(tr("错误信息框实例xx。"));  
  5.      box.showMessage(tr("错误信息框实例xx。"));  
  6.      box.showMessage(tr("错误信息框实例xx。"));  
  7.      box.showMessage(tr("错误信息框实例yy。"));  
  8.      box.showMessage(tr("错误信息框实例zz。"));  
  9.      box.exec();  
  10. }   

勾选“再次显示这个消息”,相同的消息会出现多次。若不勾选,则上述的“错误信息框实例xx。”只显示一次。

4、打开文件信息框


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {  
  2.        QString fileName = QFileDialog::getOpenFileName(this,  
  3.                                                 tr("打开文件"),  
  4.                                                 "/",  
  5.                                                 tr("任何文件(*.*)"  
  6.                                                     ";;文本文件(*.txt)"  
  7.                                                     ";;C++文件(*.cpp)"));  
  8.         if (fileName.length() != 0) {  
  9.           displayTextEdit->setText(fileName);  
  10.         }  
  11. }  

       QFileDialog提供了很多静态函数,用于获取用户选择的文件。getOpenFileName()函数在Windows和MacOS X平台上提供的是本地的对话框。当然也可以使用QFileDialog类,该类提供的始终是Qt自己绘制的对话框,而不都是调用系统资源API。具体的各个参数的含义可以查看Qt的帮助文档。

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {  
  2.         QFileDialog *fileDialog = new QFileDialog(this);  
  3.         fileDialog->setWindowTitle(tr("Open Image"));  
  4.         fileDialog->setDirectory(".");  
  5.         fileDialog->setFilter(tr("Source Files(*.cpp *.c)"));  
  6.         if(fileDialog->exec() == QDialog::Accepted) {  
  7.             QString path = fileDialog->selectedFiles()[0];  
  8.             displayTextEdit->setText(path);  
  9.             //QMessageBox::information(NULL, tr("Path"), tr("You selected ") + path);  
  10.         } else {  
  11.             //QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files."));  
  12.         }  
  13. }   

5、打开多个文件对话框

比上述打开文件对话框多了个打开多个对话框的功能,其他一样。

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void CBuiltinDlg::MultiOpenFile()  
  2. {  
  3.     QStringList files = QFileDialog::getOpenFileNames(  
  4.                                     this, tr("Select one or more files to open"),  
  5.                                     "/",  
  6.                                     tr("All Files (*);;Text Files (*.txt)"));  
  7.     if (files.count()) {  
  8.         displayTextEdit->setText(QString("[%1]").arg(files.join(", ")));  
  9.     }  
  10. }  

6、保存文件对话框

与打开文件对话框类似。也提供本地的对话框和Qt自己绘制的对话框。

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void CBuiltinDlg::SaveFileName()  
  2. {  
  3.     /* 
  4.     //getOpenFileName()函数在Windows和MacOS X平台上提供的是本地的对话框 
  5.     QFileDialog::Options options; 
  6.     QString selectedFilter; 
  7.     options |= QFileDialog::DontUseNativeDialog; 
  8.     QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), 
  9.                                displayTextEdit->toPlainText(), 
  10.                                tr("file (*.cpp *.c *.txt)"), 
  11.                                &selectedFilter, 
  12.                                options); 
  13.      if (!fileName.isEmpty()) { 
  14.         //save fileName 
  15.         displayTextEdit->setText("save file:" + fileName); 
  16.      } 
  17.      */  
  18.      //QFileDialog提供的始终是Qt自己绘制的对话框  
  19.      QFileDialog* saveFileDialog = new QFileDialog(this);  
  20.      saveFileDialog->setWindowTitle(QString("Save File"));  
  21.      saveFileDialog->setFileMode(QFileDialog::AnyFile);  
  22.      saveFileDialog->setNameFilter(tr("file (*.cpp *.c *.txt)"));  
  23.      QString* fileName=new QString();  
  24.      if(saveFileDialog->exec())  
  25.         *fileName = saveFileDialog->getSaveFileName();  
  26.      if(fileName->size() > 0) {  
  27.          displayTextEdit->setText("save file:" + *fileName);  
  28.      }  
  29.      delete fileName;  
  30.      fileName = NULL;  
  31. }  

7、字体对话框


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {          
  2.         bool ok;  
  3.         const QFont& font = QFontDialog::getFont(&ok,  
  4.                                     displayTextEdit->font(),  
  5.                                     this,  
  6.                                     tr("字体对话框"));  
  7.         if(ok) {// 如果<确定>,设置字体.  
  8.             displayTextEdit->setFont(font);  
  9.         }  
  10. }  

8、页设置对话框


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {  
  2.         QPrinter printer;  
  3.         QPageSetupDialog dlg(&printer, this);  
  4.         dlg.setWindowTitle(tr("页设置对话框"));  
  5.         if (dlg.exec() == QDialog::Accepted) {  
  6.             // 进行下一步的处理。  
  7.         }  
  8. }  

9、选择文件夹对话框

可以通过options选项设置对话框显示的文件类型,与打开文件对话框类似。
[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void CBuiltinDlg::GettExistingDirectory()  
  2. {  
  3.     QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly;  
  4.     options |= QFileDialog::DontUseNativeDialog;  
  5.     QString directory = QFileDialog::getExistingDirectory(this,  
  6.                                     tr("Open Directory"),  
  7.                                     "/home",  
  8.                                     options);  
  9.     if (!directory.isEmpty())  
  10.         displayTextEdit->setText(directory);  
  11. }  

10、进度对话框

显示文件复制或文件下载的进度条。

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {          
  2.         QProgressDialog progress(tr("正在复制文件..."), tr("取消"), 0, 1000, this);  
  3.         QFont font("ZYSong18030",10);  
  4.         progress.setFont(font);  
  5.   
  6.         progress.setWindowModality(Qt::WindowModal);  
  7.         progress.setWindowTitle(tr("进度对话框"));  
  8.         progress.show();  
  9.         for (int i = 0; i < 1000; i++) {  
  10.             progress.setValue(i);  
  11.             qApp->processEvents();  
  12.             if (progress.wasCanceled())  
  13.                 break;  
  14.             QTest::qWait(1);  
  15.             //... 复制文件处理。  
  16.         }  
  17.         progress.setValue(1000);  
  18. }  

11、打印对话框


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. {  
  2.         QPrinter printer;  
  3.         QPrintDialog dlg(&printer, this);  
  4.         dlg.setWindowTitle(tr("打印对话框"));  
  5.         if (dlg.exec() == QDialog::Accepted) {  
  6.             // 进行下一步的处理。  
  7.         }  
  8. }  

12、输入对话框

输入对话框包括:字符串输入、下拉列表框输入、Int类型输入和Double类型输入。


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void CBuiltinDlg::slotName()  
  2. {  
  3.     bool ok;  
  4.     QString name = QInputDialog::getText(this,  
  5.                                          tr("用户名"),  
  6.                                          tr("请输入新的用户名:"),  
  7.                                          QLineEdit::Normal,  
  8.                                          "name",  
  9.                                          &ok);  
  10.     if(ok && !name.isEmpty()) {  
  11.         displayTextEdit->setText(name);  
  12.     }  
  13. }  
  14.   
  15. void CBuiltinDlg::slotSex()  
  16. {  
  17.     QStringList list;  
  18.     list << tr("男") << tr("女");  
  19.     bool ok;  
  20.     QString sex = QInputDialog::getItem(this,tr("性别"),  
  21.                 tr("请选择性别:"),list,0,false,&ok);  
  22.     if (ok) {  
  23.         displayTextEdit->setText(sex);  
  24.     }  
  25. }  
  26.   
  27. void CBuiltinDlg::slotAge()  
  28. {  
  29.     bool ok;  
  30.     int age = QInputDialog::getInteger(this,tr("年龄"),  
  31.                 tr("请输入年龄:"), 20,0,150,1,&ok);  
  32.     if(ok) {  
  33.         displayTextEdit->setText(QString(tr("%1")).arg(age));  
  34.     }  
  35. }  
  36.   
  37. void CBuiltinDlg::slotStature()  
  38. {  
  39.     bool ok;  
  40.     double high = QInputDialog::getDouble(this,tr("身高"),  
  41.                 tr("请输入身高:"),175.00,0,230.00,1,&ok);  
  42.     if(ok) {  
  43.         displayTextEdit->setText(QString(tr("%1")).arg(high));  
  44.     }  
  45. }  

13、消息对话框

消息对话框如下:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void CBuiltinDlg::slotQuestion()  
  2. {  
  3.     switch(QMessageBox::question(this,tr("询问"),tr("重新开始?"),  
  4.             QMessageBox::Ok|QMessageBox::Cancel,QMessageBox::Ok))  
  5.     {  
  6.     case QMessageBox::Ok:  
  7.         displayTextEdit->setText(tr("询问按钮 / 确定"));  
  8.         break;  
  9.     case QMessageBox::Cancel:  
  10.         displayTextEdit->setText(tr("询问按钮 / 取消"));  
  11.         break;  
  12.     default:  
  13.         break;  
  14.     }  
  15. }  
  16. void CBuiltinDlg::slotInformation()  
  17. {  
  18.      QMessageBox::information(this,tr("提示"),tr("提示信息"));  
  19.      displayTextEdit->setText(tr("提示信息框"));  
  20. }  
  21. void CBuiltinDlg::slotWarning()  
  22. {  
  23.     switch(QMessageBox::warning(this,tr("警告"),tr("是否要保存文档?"),  
  24.             QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel,QMessageBox::Save))  
  25.     {  
  26.     case QMessageBox::Save:  
  27.         displayTextEdit->setText(tr("警告对话框 / 保存"));  
  28.         break;  
  29.     case QMessageBox::Discard:  
  30.         displayTextEdit->setText(tr("警告对话框 / 不保存"));  
  31.         break;  
  32.     case QMessageBox::Cancel:  
  33.         displayTextEdit->setText(tr("警告对话框 / 取消"));  
  34.         break;  
  35.     default:  
  36.         break;  
  37.     }  
  38. }  
  39. void CBuiltinDlg::slotCritical()  
  40. {  
  41.     QMessageBox::critical(this, tr("错误"),tr("告诉用户一个严重的错误!"));  
  42.     displayTextEdit->setText(tr("错误信息框"));  
  43. }  
  44. void CBuiltinDlg::slotAbout()  
  45. {  
  46.     QMessageBox::about(this,tr("关于"),tr("对话框例子!"));  
  47.     displayTextEdit->setText(tr("关于信息框"));  
  48. }  
  49. void CBuiltinDlg::slotAboutQt()  
  50. {  
  51.     QMessageBox::aboutQt(this, tr("关于Qt"));  
  52.     displayTextEdit->setText(tr("关于Qt信息框"));  
  53. }  
  54. void CBuiltinDlg::slotCustom()  
  55. {  
  56.     QMessageBox customMsgBox;  
  57.     customMsgBox.setWindowTitle(tr("自定义弹出对话框"));  
  58.     QPushButton *lockButton = customMsgBox.addButton(tr("加锁"),QMessageBox::ActionRole);  
  59.     QPushButton *unlockButton = customMsgBox.addButton(tr("解锁"),QMessageBox::ActionRole);  
  60.     QPushButton *cancelButton = customMsgBox.addButton(QMessageBox::Cancel);  
  61.     customMsgBox.setText(tr("这是自定义对话框"));  
  62.     customMsgBox.exec();  
  63.   
  64.     if(customMsgBox.clickedButton() == lockButton)  
  65.         displayTextEdit->setText(tr("自定义对话框 / 加锁"));  
  66.     if(customMsgBox.clickedButton() == unlockButton)  
  67.         displayTextEdit->setText(tr("自定义对话框 / 解锁"));  
  68.     if(customMsgBox.clickedButton() == cancelButton)  
  69.         displayTextEdit->setText(tr("自定义对话框 / 取消"));  
  70. }  

14、向导对话框

创建一个向导对话框,可以在页面上添加各种控件。


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void CBuiltinDlg::slotWizard()  
  2. {  
  3.     QWizard wizard;  
  4.     wizard.addPage(createFirstPage());  
  5.     wizard.addPage(createSecondPage());  
  6.   
  7.     wizard.setWindowTitle(tr("向导对话框"));  
  8.     wizard.exec();  
  9. }  
  10.   
  11. QWizardPage* CBuiltinDlg::createFirstPage()  
  12. {  
  13.     QWizardPage *page = new QWizardPage;  
  14.     page->setTitle(tr("简介"));  
  15.   
  16.     QLabel *label = new QLabel(tr("第一页"));  
  17.     label->setWordWrap(true);  
  18.   
  19.     QVBoxLayout *layout = new QVBoxLayout;  
  20.     layout->addWidget(label);  
  21.     page->setLayout(layout);  
  22.     return page;  
  23. }  
  24. QWizardPage* CBuiltinDlg::createSecondPage()  
  25. {  
  26.      QWizardPage *page = new QWizardPage;  
  27.      page->setTitle(tr("正文"));  
  28.   
  29.      QLabel *label = new QLabel(tr("第二页"));  
  30.      label->setWordWrap(true);  
  31.   
  32.      QVBoxLayout *layout = new QVBoxLayout;  
  33.      layout->addWidget(label);  
  34.      page->setLayout(layout);  
  35.      return page;  
  36. }  

15、颜色控件框


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void CBuiltinDlg::slotColor(int index)  
  2. {  
  3.     QStringList colorList = QColor::colorNames();  
  4.     QColor color = QColor(colorList[index]);  
  5.     QPalette p = displayTextEdit->palette();  
  6.     p.setColor(QPalette::Text, color);  
  7.     displayTextEdit->setPalette(p);  
  8. }  
可以选择使用Qt内置的颜色。
0 0
原创粉丝点击