学习笔记之Qt4内建对话框

淡淡的烟草味﹌ 2022-07-14 08:51 408阅读 0赞

为了方便程序员进行某些特定功能对话框的编程,Qt提供了一套标准的通用对话框。这些内建的对话框都提供了一些便于使用的静态函数。在windows系统上,这些静态函数将会调用本地的windows对话框;而在Mac OS X系统下,这些静态函数将会调用本地的Mac OS X对话框。
Qt提供的内建对话框有:
1、颜色对话框QColorDialog,能够允许用户选择颜色;
2、错误消息框QErrorMessage,显示错误信息;
3、文件对话框QFileDialog,能够允许用户选择一个或多个文件以及目录;
4、字体对话框QFontDialog,允许用户选择/设置字体;
5、输入对话框QInputDialog,允许用户进行简单的输入,比如输入一行文本或者一个数字等;
6、页设计对话框QPageSetupDialog,配置与页相关的打印机选项;
7、进度对话框QProgressDialog,指示一个长时间操作的工作进度,以及用户该操作是否已经停滞;
8、打印对话框QPrintDialog,配置打印机。可以允许用户选择可用的打印机,以及允许用户设置文档相关的设置(例如,纸张大小以及方向等),打印类型(彩色打印或黑白打印)、页码范围和打印的份数等;
9、QMessageBox消息框。

使用内建对话框实例:
1、用qt creator创建一个名为builtin的empty qt project工程;
2、在工程中添加builtindlg.h,builtindlg.cpp,builtin.cpp文件,代码如下:

builtindlg.h

  1. #ifndef BUILTINDLG_H
  2. #define BUILTINDLG_H
  3. #include<QtGui/QDialog>
  4. #include<QtGui/QGridLayout>
  5. class QTextEdit;
  6. class QPushButton;
  7. class CBuiltinDlg:public QDialog
  8. {
  9. Q_OBJECT
  10. public:
  11. CBuiltinDlg(QWidget *parent=0);
  12. virtual ~CBuiltinDlg(){}
  13. private:
  14. QTextEdit* displayTextEdit;
  15. QPushButton* colorPushBtn;
  16. QPushButton* errorPushBtn;
  17. QPushButton* filePushBtn;
  18. QPushButton* fontPushBtn;
  19. QPushButton* inputPushBtn;
  20. QPushButton* pagePushBtn;
  21. QPushButton* progressPushBtn;
  22. QPushButton* printPushBtn;
  23. QPushButton* btn;
  24. QGridLayout* gridLayout;
  25. private slots:
  26. void doPushBtn();
  27. };
  28. #endif // BUILTINDLG_H

builtindlg.cpp

  1. #include<QtGui/QtGui>
  2. #include"builtindlg.h"
  3. CBuiltinDlg::CBuiltinDlg(QWidget* parent):QDialog(parent)
  4. {
  5. // 创建一个显示内容为“Qt的标准通用对话框。”的文本编辑框QTextEdit对象
  6. displayTextEdit=new QTextEdit(tr("Qt的标准通用对话框。"));
  7. //创建一个网格布局管理器gridLayout对象,然后将各个按钮对象添加到该布局管理器中
  8. gridLayout=new QGridLayout;
  9. colorPushBtn=new QPushButton(tr("颜色对话框"));
  10. errorPushBtn=new QPushButton(tr("错误消息框"));
  11. filePushBtn=new QPushButton(tr("文件对话框"));
  12. fontPushBtn=new QPushButton(tr("字体对话框"));
  13. inputPushBtn=new QPushButton(tr("输入对话框"));
  14. pagePushBtn=new QPushButton(tr("页设计对话框"));
  15. progressPushBtn=new QPushButton(tr("进度对话框"));
  16. printPushBtn=new QPushButton(tr("打印对话框"));
  17. gridLayout->addWidget(colorPushBtn,0,0,1,1);
  18. gridLayout->addWidget(errorPushBtn,0,1,1,1);
  19. gridLayout->addWidget(filePushBtn,0,2,1,1);
  20. gridLayout->addWidget(fontPushBtn,1,0,1,1);
  21. gridLayout->addWidget(inputPushBtn,1,1,1,1);
  22. gridLayout->addWidget(pagePushBtn,1,2,1,1);
  23. gridLayout->addWidget(progressPushBtn,2,0,1,1);
  24. gridLayout->addWidget(printPushBtn,2,1,1,1);
  25. gridLayout->addWidget(displayTextEdit,3,0,3,3);
  26. //将gridLayout设置为内建对话框CBuiltinDlg对象的顶层布局管理器
  27. setLayout(gridLayout);
  28. //将信号与槽关联起来
  29. connect(colorPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
  30. connect(errorPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
  31. connect(filePushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
  32. connect(fontPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
  33. connect(inputPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
  34. connect(pagePushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
  35. connect(progressPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
  36. connect(printPushBtn,SIGNAL(clicked()),this,SLOT(doPushBtn()));
  37. //设置对话框的标题和大小
  38. setWindowTitle(tr("内建对话框"));
  39. resize(400,300);
  40. }
  41. //重写槽函数doPushBtn()
  42. void CBuiltinDlg::doPushBtn()
  43. {
  44. btn=qobject_cast<QPushButton*>(sender());
  45. if(btn==colorPushBtn)
  46. {
  47. //颜色对话框
  48. QPalette palette=displayTextEdit->palette();
  49. const QColor& color=QColorDialog::getColor(palette.color(QPalette::Base),this);
  50. if(color.isValid())
  51. {
  52. palette.setColor(QPalette::Base,color);
  53. displayTextEdit->setPalette(palette);
  54. }
  55. }
  56. else if(btn==errorPushBtn)
  57. {
  58. //错误消息框
  59. QErrorMessage box(this);
  60. box.setWindowTitle(tr("错误消息框"));
  61. box.showMessage(tr("错误消息框实例xx。"));
  62. box.showMessage(tr("错误消息框实例xx。"));
  63. box.showMessage(tr("错误消息框实例xx。"));
  64. box.showMessage(tr("错误消息框实例yy。"));
  65. box.showMessage(tr("错误消息框实例zz。"));
  66. box.exec();
  67. }
  68. else if(btn==filePushBtn)
  69. {
  70. //文件对话框
  71. QString fileName=QFileDialog::getOpenFileName(this,tr("打开文件"),
  72. "/home/czm",
  73. tr("任何文件(*.*)"
  74. ";;文本文件(*.txt)"
  75. ";;XML文件(*.xml)"));
  76. displayTextEdit->setText(fileName);
  77. }
  78. else if(btn==fontPushBtn)
  79. {
  80. //字体对话框
  81. bool ok;
  82. const QFont& font=QFontDialog::getFont(&ok,
  83. displayTextEdit->font(),
  84. this,
  85. tr("字体对话框"));
  86. if(ok)
  87. {
  88. //如果<确定>,设置字体
  89. displayTextEdit->setFont(font);
  90. }
  91. }
  92. else if(btn==inputPushBtn)
  93. {
  94. //输入对话框
  95. bool ok;
  96. QString text=QInputDialog::getText(this,
  97. tr("输入对话框"),
  98. tr("输入文本:"),
  99. QLineEdit::Normal,
  100. QDir::home().dirName(),
  101. &ok);
  102. if(ok && !text.isEmpty())
  103. displayTextEdit->setText(text);
  104. }
  105. else if(btn==pagePushBtn)
  106. {
  107. //页设置对话框
  108. QPrinter printer;
  109. QPageSetupDialog dlg(&printer,this);
  110. dlg.setWindowTitle(tr("页设置对话框"));
  111. if(dlg.exec()==QDialog::Accepted)
  112. {
  113. //进行下一步的处理
  114. }
  115. }
  116. else if(btn==progressPushBtn)
  117. {
  118. //进度对话框
  119. QProgressDialog progress(tr("正在复制文件..."),
  120. tr("取消"),
  121. 0,
  122. 10000,
  123. this);
  124. progress.setWindowModality(Qt::WindowModal);
  125. progress.setWindowTitle(tr("进度对话框"));
  126. progress.show();
  127. for(int i=0;i<10000;i++)
  128. {
  129. progress.setValue(i);
  130. qApp->processEvents();
  131. if(progress.wasCanceled())
  132. break;
  133. //...复制文件处理
  134. qDebug()<<i;
  135. }
  136. progress.setValue(10000);
  137. }
  138. else if(btn==printPushBtn)
  139. {
  140. //打印对话框
  141. QPrinter printer;
  142. QPrintDialog dlg(&printer,this);
  143. dlg.setWindowTitle(tr("打印对话框"));
  144. if(dlg.exec()==QDialog::Accepted)
  145. {
  146. //进行下一步处理
  147. }
  148. }
  149. }

注:曹函数的开头,首先是获取发送信号的QPushButton对象的指针。函数QObject:sender()返回发送信号的对象的指针,返回类型为QObject*。模板函数
T qobject_cast(QObject* object)
完成类型的转换,将类型的对象指针转换为类型为的对象指针,如果转换成功,返回正确的对象指针,否则返回0。(类型T必须是直接或间接继承自QObject的类,并且在该类的定义里有Q_OBJECT宏变量,否则qobject_cast()函数的返回值是未定义的。)

1、创建颜色对话框的代码解析
1.1 QTextEdit::palette()获取文本编辑框对象displayTextEdit的调色板;
1.2 用QColorDialog::getColor()函数创建并显示一个模态的颜色对话框,并返回用户选择的颜色对象的常量引用赋给变量color;如果用户点击“取消”按钮,颜色对话框将返回一
个无效的颜色;颜色对话框的颜色初始化为palette.color(QPalette::Base),即文本编辑框的背景色;父窗口部件为this。
1.3 QColor::isValid()函数判断颜色对话框返回的颜色是否有效。
-〉若有效,函数QPalette::setColor()设置调色板的背景颜色为颜色对话框返回的颜色;
-〉此处的QPalette::setColor()有两个参数,第一个参数QPalette::Base指定了调色板的角色,告诉程序应该设置调色板的所有三个颜色组中的哪一个角色的颜色;第二个参数color指定应该设置的颜色。
1.4 函数QTextEdit::setPalette()重新设置文本编辑框的调色板。

2、创建错误消息框的代码的解析
2.1 函数QErrorMessage::showMessage()功能是在错误消息框中显示错误信息。

3、文件对话框的代码的解析
3.1 函数QFileDialog::getOpenFileName()功能是获取用户选择的文件名并显示在文本编辑框中。
3.2 该函数在此处有4个参数:
第1个参数指定文件对话框的父窗口部件;
第2个参数指定文件对话框的标题;
第3个参数指定文件对话框的默认路径;
第4个参数指定了文件对话框的多个文件过滤器,过滤器之间通过两个分号“;;”间隔

4、字体对话框的代码的解析
4.1 函数QFontDialog::getFont()创建并显示一个字体对话框。此处有4个参数:
第1个参数是一个输入参数,用于标识用户的选择状态。单击“正确”ok变量为true;单击“取消”按钮ok变量为false;
第2个参数指定了对话框的初始颜色,当用户取消颜色的选择时,字体对话框将初始颜色作为返回值;
第3个参数指定了父窗口部件;
第4个参数制定了字体对话框的标题;

5、输入对话框的代码的解析
5.1 QInputDialog::getText()函数创建并显示一个文本输入对话框。这里有6个参数:
前2个参数分别指定了输入对话框的父窗口部件和对话框的标题;
第3个参数指定了标签的显示文本;
第4个参数指定了行编辑框QLineEdit输入内容的显示模式;
第5个参数制定了行编辑框默认的显示内容,函数QDir::home()返回用户的home路径,QDir::dirName()返回路径的名字;
第6个参数标识用户的选择状态,和函数QFontDialog::getFont()的第一个参数作用相同;

6、进度对话框的代码的解析
6.1 首先调用了QProgressDialog的构造函数,创建了一个进度对话框的栈对象。该构造函数有5个参数:
第一个参数是一个字符串,他指定了显示给用户的提示信息,表明当前正在进行的工作;
第2个参数指定了“取消”按钮的显示文本,如果该参数为0,进度对话框将没有“取消”按钮;
第3,4个参数分别指定了操作的步数,在这个实例中,假定进度对话框显示复制10000个文件的进展情况,第3个参数设定为0,第4个参数设定为10000,即这两个参数的差值决定了这个复制操作的步数为10000;
第5个参数指定了进度对话框的父窗口部件;
6.2 函数setWindowModality()设置进度对话框的类型为Qt::WindowModal,即模态对话框。

builtin.cpp

  1. #include<QtGui/QtGui>
  2. #include"builtindlg.h"
  3. int main(int argc,char *argv[])
  4. {
  5. QApplication app(argc,argv);
  6. QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
  7. CBuiltinDlg dlg;
  8. return dlg.exec();
  9. }

发表评论

表情:
评论列表 (有 0 条评论,408人围观)

还没有评论,来说两句吧...

相关阅读

    相关 QT学习笔记4(动画)

    Qt自带的动画框架用来做简单的控件动画效果是比较简单易用的,像是对控件的位移、缩放、不透明度这些来做动画效果。  动画框架结构 ![b7681787a114f75806

    相关 QT入门笔记--创建对话框

    创建对话框的基本步骤: *创建并初始化子窗口部件 *把子窗口部件放到布局中 *设置Tab键顺序(本文省略了此步骤) *建立信号-槽之间的连接 *实现对话框