当前位置:   article > 正文

Qt Creator快速入门(第3版)

qt creator快速入门

​​​第1章Qt Creator简介

可以参考Qt开源社区(www.qter.org)

 打开文件所在的文件夹:

Ctrl+ Tab快捷键,可以在多个打开的文档切换

帮助里面的:

书签:Ctrl十 M

第2章  Hello World

1.主设计区;2.部件列表窗口( Widget Box );3.对象查看器(Object Inspector );4.属性编辑器(Property Editor);5.动作(Action)编辑器与信号和槽编辑器。

编译运行程序:Ctrl+R 

1.直接运行生成的可执行文件

C:\Qt\Qt5.8.0\5.8\mingw53_32\bin中,将其复制到debug目录里面。完成后helloworld.exe就可以运行了。也可以设置环境变量,以后在本机就可以直接运行生成的可执行文件了。

2.发布

重命名为“我的第一个Qt程序”,然后将release 文件夹中的helloworld. exe复制过来,再去Qt安装目录的bin目录中将libgcc_s_dw2-1.dll、libstde++-6.dll、lib-winpthread-1.dll、Qt5Core.dll、Qt5Gui. dll和Qt5Widgets. dll这6个文件复制过来。

另外,还需要将C:\Qt\Qt5. 6. 1\5. 6\mingw49_ 32\plugins目录中的platforms文件夹复制过来(不要修改该文件夹名称),里面只需要保留qwindows. dll文件即可。这时就可以将压缩包发布出去了。

还有 windeployqt工具,建议一般情况下不要使用

3.设置应用程序图标

把要设置的ico图标放到源码目录,例如myico.ico文件,然后打开项目文件helloworld.pro,在最下面添加一行代码:

RC_ICONS = myico.ico

再次运行程序,可以看到窗口左上角出现了设置的图标

4.纯代码编写程序 与命令行编译

helloworld.pro

  1. QT += core gui #core 和 gui模块
  2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #兼容Qt4
  3. TARGET = helloworld #目标文件的名字
  4. TEMPLATE = app #app模板,表明是应用程序
  5. SOURCES += main.cpp\ #源文件
  6. hellodialog.cpp
  7. HEADERS += hellodialog.h #头文件
  8. FORMS += hellodialog.ui #界面文件
  9. RC_ICONS = myico.ico #图标

core 模块包含了Qt的核心功能,其他所有模块都依赖于这个模块;

gui模块提供了窗口系统集成、事件处理、OpenGL和OpenGLES集成、2D图形、基本图像、字体和文本等功能。当使用qmake工具来构建项目时,core模块和gui模块是被默认包含。

代码自动补全功能“Ctrl+空格键”:索引中通过 Completing Code关键字查看

将鼠标指针放到类名或函数上,F1键就可以在编辑器右边快速打开,帮助文档


5.项目模式和项目文件

Shadowbuild选项,就是所谓的“影子构建”

第3章 窗口部件

3.1.1窗口、子 部件以及窗口类型

.pro 文件

  1. QT += widgets
  2. SOURCES += \
  3. main.cpp

main.cpp

  1. #include <QtWidgets>
  2. int main(int argc, char *argv[])
  3. {
  4. QApplication a(argc, argv);
  5. // 新建QWidget类对象,默认parent参数是0,所以它是个窗口
  6. //QWidget *widget = new QWidget(0, Qt::Dialog | Qt::FramelessWindowHint);
  7. QWidget *widget = new QWidget();
  8. // 设置窗口标题
  9. widget->setWindowTitle(QObject::tr("我是widget"));
  10. // 新建QLabel对象,默认parent参数是0,所以它是个窗口
  11. //QLabel *label = new QLabel(0, Qt::SplashScreen | Qt::WindowStaysOnTopHint);
  12. QLabel *label = new QLabel();
  13. label->setWindowTitle(QObject::tr("我是label"));
  14. // 设置要显示的信息
  15. label->setText(QObject::tr("label:我是个窗口"));
  16. // 改变部件大小,以便能显示出完整的内容
  17. label->resize(180, 20);
  18. // label2指定了父窗口为widget,所以不是窗口
  19. QLabel *label2 = new QLabel(widget);
  20. label2->setText(QObject::tr("label2:我不是独立窗口,只是widget的子部件"));
  21. label2->resize(250, 20);
  22. // 在屏幕上显示出来
  23. label->show();
  24. widget->show();
  25. int ret = a.exec();
  26. delete label;
  27. delete widget;
  28. return ret;
  29. }

顶级部件( top-level widget)子部件(child widget)

3..1.2 窗口几何布局

geometry:[dʒiˈɒmətri],几何学; 几何形状; 几何结构; 几何图形; 

  1. #include <QApplication>
  2. #include <QWidget>
  3. #include <QDebug>
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication a(argc, argv);
  7. QWidget widget;
  8. widget.resize(400, 300); // 设置窗口大小
  9. widget.move(200, 100); // 设置窗口位置
  10. widget.show();
  11. int x = widget.x();
  12. qDebug("x: %d", x); // 输出x的值
  13. int y = widget.y();
  14. qDebug("y: %d", y);
  15. QRect geometry = widget.geometry();
  16. QRect frame = widget.frameGeometry();
  17. qDebug() << "geometry: " << geometry << "frame: " << frame;
  18. return a.exec();
  19. }
 

3.2对话框 QDialog

模态的(modal)和非模态的(modeless)

模态对话框就是在没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互,

比如新建项目时弹出的对话框。而对于非模态对话框,既可以与它交互,也可以与同一程序中的其他窗口交互

  1. MyWidget::MyWidget(QWidget *parent) :
  2. QWidget(parent),
  3. ui(new Ui::MyWidget)
  4. {
  5. ui->setupUi(this);
  6. QDialog *dialog = new QDialog(this);
  7. dialog->setModal(true);//去掉之后就是,非模态了
  8. dialog->show();
  9. }

它与用exec()函数时的效果是不一样的,因为现在的MyWidget窗口也显示出来了。这是因为调用完show()函数后会立即将控制权交给调用者,程序可以继续往下执行。而调用exec()函数却不同,只有当对话框被关闭时才会返回。与setModal()函数相似的还有一个setWindowModality()函数,它有一个参数来设置模态对话框要阻塞的窗口类型,可以是Qt::NonModal(不阻塞任何窗口,就是非模态)、Qt::WindowModal(阻塞它的父窗口、所有祖先窗口以及它们的子窗口)或Qt:: ApplicationModal(阻塞整个应用程序的所有窗口)。而setModal()默认设置的是Qt: : ApplicationModal。

3.2.2多窗口切换

自动关联就是将关联函数整合到槽命名中,比如前面的槽可以重命名为on_show_ChildButton_clicked(), 就是由字符on、发射信号的部件对象名和信号名组成。

  1. void MyWidget::on_showChildButton_clicked()
  2. {
  3. QDialog *dialog = new QDialog(this);
  4. dialog->show();
  5. }

2.自定义对话框

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4. MyWidget w;
  5. MyDialog dialog; // 新建MyDialog类对象
  6. if(dialog.exec()==QDialog::Accepted){ // 判断dialog执行结果
  7. w.show(); // 如果是按下了“进入主界面”按钮,则显示主界面
  8. return a.exec(); // 程序正常运行
  9. }
  10. else return 0; // 否则,退出程序
  11. }

退出:

进入主界面:

  1. void MyWidget::on_showChildButton_clicked()
  2. {
  3. QDialog *dialog = new QDialog(this);
  4. dialog->show();
  5. }
  6. void MyWidget::on_pushButton_clicked()
  7. {
  8. // 先关闭主界面,其实它是隐藏起来了,并没有真正退出。然后新建MyDialog对象
  9. close();
  10. MyDialog dlg;
  11. // 如果按下了“进入主窗口”按钮,则再次显示主界面
  12. // 否则,因为现在已经没有显示的界面了,所以程序将退出
  13. if(dlg.exec() == QDialog::Accepted) show();
  14. }

需要说明的是那个close()槽,它不一.定使程序退出,只有当只剩下最后一个主界面了(就是没有父窗口的界面),这时调用close()槽,程序才会退出;而其他情况下界面只是隐藏起来了,并没有被销毁。这里还需要包含MyDialog类的头文件井include
“mydialog. h",然后运行程序查看效果。


3.2.3标准对话框

mywidget.h 

  1. private slots:
  2. void on_pushButton_clicked();
  3. void on_pushButton_2_clicked();
  4. void on_pushButton_3_clicked();
  5. void on_pushButton_4_clicked();
  6. void on_pushButton_5_clicked();
  7. void on_pushButton_6_clicked();
  8. void on_pushButton_7_clicked();
  9. void on_pushButton_8_clicked();
  10. private:
  11. Ui::MyWidget *ui;
  12. QErrorMessage *errordlg;
  13. QWizardPage *createPage1(); // 新添加
  14. QWizardPage *createPage2(); // 新添加
  15. QWizardPage *createPage3(); // 新添加

mywidget.cpp 

  1. #include "mywidget.h"
  2. #include "ui_mywidget.h"
  3. #include <QDebug>
  4. #include <QColorDialog>
  5. #include <QFileDialog>
  6. #include <QFontDialog>
  7. #include <QInputDialog>
  8. #include <QMessageBox>
  9. #include <QProgressDialog>
  10. #include <QErrorMessage>
  11. MyWidget::MyWidget(QWidget *parent) :
  12. QWidget(parent),
  13. ui(new Ui::MyWidget)
  14. {
  15. ui->setupUi(this);
  16. errordlg = new QErrorMessage(this);
  17. }
  18. MyWidget::~MyWidget()
  19. {
  20. delete ui;
  21. }
  22. // 颜色对话框
  23. void MyWidget::on_pushButton_clicked()
  24. {
  25. // QColor color = QColorDialog::getColor(Qt::red, this, tr("颜色对话框"),
  26. // QColorDialog::ShowAlphaChannel);
  27. QColorDialog dialog(Qt::red, this); // 创建对象
  28. dialog.setOption(QColorDialog::ShowAlphaChannel); // 显示alpha选项
  29. dialog.exec(); // 以模态方式运行对话框
  30. QColor color = dialog.currentColor(); // 获取当前颜色
  31. qDebug() << "color: " << color;
  32. }
  33. // 文件对话框
  34. void MyWidget::on_pushButton_2_clicked()
  35. {
  36. // QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"),
  37. // "D:", tr("图片文件(*png *jpg);;文本文件(*txt)"));
  38. // qDebug() << "fileName:" << fileName;
  39. QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("文件对话框"),
  40. "D:", tr("图片文件(*png *jpg)"));
  41. qDebug()<< "fileNames:" << fileNames;
  42. }
  43. // 字体对话框
  44. void MyWidget::on_pushButton_3_clicked()
  45. {
  46. // ok用于标记是否按下了“OK”按钮
  47. bool ok;
  48. QFont font = QFontDialog::getFont(&ok, this);
  49. // 如果按下“OK”按钮,那么让“字体对话框”按钮使用新字体
  50. // 如果按下“Cancel”按钮,那么输出信息
  51. if (ok) ui->pushButton_3->setFont(font);
  52. else qDebug() << tr("没有选择字体!");
  53. }
  54. // 输入对话框
  55. void MyWidget::on_pushButton_4_clicked()
  56. {
  57. bool ok;
  58. // 获取字符串
  59. QString string = QInputDialog::getText(this, tr("输入字符串对话框"),
  60. tr("请输入用户名:"), QLineEdit::Normal,tr("admin"), &ok);
  61. if(ok) qDebug() << "string:" << string;
  62. // 获取整数
  63. int value1 = QInputDialog::getInt(this, tr("输入整数对话框"),
  64. tr("请输入-1000到1000之间的数值"), 100, -1000, 1000, 10, &ok);
  65. if(ok) qDebug() << "value1:" << value1;
  66. // 获取浮点数
  67. double value2 = QInputDialog::getDouble(this, tr("输入浮点数对话框"),
  68. tr("请输入-1000到1000之间的数值"), 0.00, -1000, 1000, 2, &ok);
  69. if(ok) qDebug() << "value2:" << value2;
  70. QStringList items;
  71. items << tr("条目1") << tr("条目2");
  72. // 获取条目
  73. QString item = QInputDialog::getItem(this, tr("输入条目对话框"),
  74. tr("请选择或输入一个条目"), items, 0, true, &ok);
  75. if(ok) qDebug() << "item:" << item;
  76. }
  77. // 消息对话框
  78. void MyWidget::on_pushButton_5_clicked()
  79. {
  80. // 问题对话框
  81. int ret1 = QMessageBox::question(this, tr("问题对话框"),
  82. tr("你了解Qt吗?"), QMessageBox::Yes, QMessageBox::No);
  83. if(ret1 == QMessageBox::Yes) qDebug() << tr("问题!");
  84. // 提示对话框
  85. int ret2 = QMessageBox::information(this, tr("提示对话框"),
  86. tr("这是Qt书籍!"), QMessageBox::Ok);
  87. if(ret2 == QMessageBox::Ok) qDebug() << tr("提示!");
  88. // 警告对话框
  89. int ret3 = QMessageBox::warning(this, tr("警告对话框"),
  90. tr("不能提前结束!"), QMessageBox::Abort);
  91. if(ret3 == QMessageBox::Abort) qDebug() << tr("警告!");
  92. // 错误对话框
  93. int ret4 = QMessageBox::critical(this, tr("严重错误对话框"),
  94. tr("发现一个严重错误!现在要关闭所有文件!"), QMessageBox::YesAll);
  95. if(ret4 == QMessageBox::YesAll) qDebug() << tr("错误");
  96. // 关于对话框
  97. QMessageBox::about(this, tr("关于对话框"),
  98. tr("yafeilinux致力于Qt及Qt Creator的普及工作!"));
  99. }
  100. // 进度对话框
  101. void MyWidget::on_pushButton_6_clicked()
  102. {
  103. QProgressDialog dialog(tr("文件复制进度"), tr("取消"), 0, 50000, this);
  104. dialog.setWindowTitle(tr("进度对话框")); // 设置窗口标题
  105. dialog.setWindowModality(Qt::WindowModal); // 将对话框设置为模态
  106. dialog.show();
  107. for(int i=0; i<50000; i++) { // 演示复制进度
  108. dialog.setValue(i); // 设置进度条的当前值
  109. QCoreApplication::processEvents(); // 避免界面冻结
  110. if(dialog.wasCanceled()) break; // 按下取消按钮则中断
  111. }
  112. dialog.setValue(50000); // 这样才能显示100%,因为for循环中少加了一个数
  113. qDebug() << tr("复制结束!");
  114. }
  115. // 错误信息对话框
  116. void MyWidget::on_pushButton_7_clicked()
  117. {
  118. errordlg->setWindowTitle(tr("错误信息对话框"));
  119. errordlg->showMessage(tr("这里是出错信息!"));
  120. }
  121. QWizardPage * MyWidget::createPage1() // 向导页面1
  122. {
  123. QWizardPage *page = new QWizardPage;
  124. page->setTitle(tr("介绍"));
  125. return page;
  126. }
  127. QWizardPage * MyWidget::createPage2() // 向导页面2
  128. {
  129. QWizardPage *page = new QWizardPage;
  130. page->setTitle(tr("用户选择信息"));
  131. return page;
  132. }
  133. QWizardPage * MyWidget::createPage3() // 向导页面3
  134. {
  135. QWizardPage *page = new QWizardPage;
  136. page->setTitle(tr("结束"));
  137. return page;
  138. }
  139. // 向导对话框
  140. void MyWidget::on_pushButton_8_clicked()
  141. {
  142. QWizard wizard(this);
  143. wizard.setWindowTitle(tr("向导对话框"));
  144. wizard.addPage(createPage1()); // 添加向导页面
  145. wizard.addPage(createPage2());
  146. wizard.addPage(createPage3());
  147. wizard.exec();
  148. }

3.3.1 QFrame 类族

  1. MyWidget::MyWidget(QWidget *parent) :
  2. QWidget(parent),
  3. ui(new Ui::MyWidget)
  4. {
  5. ui->setupUi(this);
  6. ui->frame->setFrameShape(QFrame::Box);
  7. ui->frame->setFrameShadow(QFrame::Sunken);
  8. // 以上两个函数可以使用setFrameStyle(QFrame::Box | QFrame::Sunken)代替
  9. ui->frame->setLineWidth(5);
  10. ui->frame->setMidLineWidth(10);
  11. QFont font;
  12. font.setFamily("华文行楷");
  13. font.setPointSize(20);
  14. font.setBold(true);
  15. font.setItalic(true);
  16. ui->label->setFont(font);
  17. QString string = tr("标题太长,需要进行省略!");
  18. QString str = ui->label->fontMetrics().elidedText(string, Qt::ElideRight, 180);
  19. ui->label->setText(str);
  20. ui->label->setPixmap(QPixmap("E:/logo.png"));
  21. QMovie *movie = new QMovie("E:/donghua.gif");
  22. ui->label->setMovie(movie); // 在标签中添加动画
  23. movie->start();
  24. }

第4章  布局管理

4.1布局管理系统

可以完成的任务:

➢定位子部件;
➢感知窗口默认大小;
➢感知窗口最小大小;
.➢窗口大小变化时进行处理;
➢当内容改变时自动更新:字体大小、文本或子部件的其他内容随之改变;隐藏或显示子部件;移除一个子部件。

4.1.1布局管理器

和QStackedLayout(栈布局管理器)
 

QBoxLayout(基本布局管理器)

  1. QHBoxLayout*layout = new QHBoxLayout;//新建水平布局管理器
  2. layout ->addWidget(ui -> fontComboBox) ;//向布局管理器中添加部件
  3. layout -> addWidget(ui ->textEdit);
  4. layout ->setSpacing(50) ;//设置部件间的间隔
  5. layout -> setContentsMargins(0, 0, 50100); 1// 设置布局管理器到边界的距离
  6. // 4个参数顺序是左,上,右,下
  7. setLayout( layout);//将这个布局设置为MyWidget类的布局

addWidget()函数向布局管理器的末尾添加部件,还有一个insertWidget()函数可以实现向指定位置添加部件,它比前者更灵活。

QGridLayout(栅格布局管理器)

  1. QGridLayout * layout = new QGr idLayout;
  2. //添加部件,从第0行0列开始,占据1行2列
  3. layout -> addWidget(ui -> fontComboBox, 00, 1, 2);
  4. //添加部件,从第0行2列开始,占据1行1列
  5. layout -> addWidget(ui -> pushButton, 02, 1, 1);
  6. //添加部件,从第1行0列开始,占据1行3列
  7. layout ->addWidget(ui ->textEdit, 1, 0, 1, 3);
  8. setLayout(layout) ;

QFormLayout(窗体布局管理器)

窗体布局管理器将它的子部件分为两列,左边是一些标签,右边是一些输人部件。找到Form Layout,然后双击或者在它上面右击并在弹出级联菜单中选择“添加窗体布局行”。在弹出的“添加表单布局行”对话框中填入标签文字“姓名(&N)",这样下面便
自动填写了“标签名称”、“字段类型”和“字段名称”等,并且设置了伙伴关系。填写的标签文字中的“(&N)”必须是英语半角的括号,表明它的快捷键是Alt十N。设置伙伴关系表示按下Alt+ N时,光标自动跳转到标签后面对应的行编辑器中。

4.1.2设置部件大小
 

转自:《Qt Creator快速入门(第3版)》_You图碧的博客-CSDN博客_qtcreator快速入门

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/81751
推荐阅读
相关标签
  

闽ICP备14008679号