当前位置:   article > 正文

C++QT5跨平台界面编程原理--Qt程序(windows、linux工程创建、Qt项目管理文件、VS中使用Qt)_c++ gui qt 5编程

c++ gui qt 5编程

目录

 

windows工程创建

linux工程创建

Qt项目管理文件

.pro文件

.ui文件

VS中使用Qt


windows工程创建

新建文件或项目对话框

  • Qt Widgets Application,支持桌面平台的有图形用户界面(Graphic User Interface,GUI) 界面的应用程序。GUI 的设计完全基于 C++ 语言,采用 Qt 提供的一套 C++ 类库。
  • Qt Console Application,控制台应用程序,无 GUI 界面,一般用于学习 C/C++ 语言,只需要简单的输入输出操作时可创建此类项目。
  • Qt Quick Application,创建可部署的 Qt Quick 2 应用程序。Qt Quick 是 Qt 支持的一套 GUI 开发架构,其界面设计采用 QML 语言,程序架构采用 C++ 语言。利用 Qt Quick 可以设计非常炫的用户界面,一般用于移动设备或嵌入式设备上无边框的应用程序的设计。
  • Qt Quick Controls 2 Application,创建基于 Qt Quick Controls 2 组件的可部署的 Qt Quick 2 应用程序。Qt Quick Controls 2 组件只有 Qt 5.7 及以后版本才有。
  • Qt Canvas 3D Application,创建 Qt Canvas 3D QML 项目,也是基于 QML 语言的界面设计,支持 3D 画布。

 Qt Widgets Application 后,单击“Choose…”按钮,出现如图 2 所示的新建项目向导:
新建项目向导第 1 步:项目名称和项目存储位置设置
选择一个目录,如“E:\QtDemo”,再设置项目名称为 Demo, 这样新建项目后,会在“E:\QtDemo”目录下新建一个目录,项目所有文件保 存在目录“E:\QtDemo\Demo\”下。

可以将这几个编译工具都选中,在编译项目时再选择一个作为当前使用的编译工具,这样可以编译生成不同版本的可执行程序。
新建项目想到第 3 步:选择界面基类
在图 3 显示的界面中单击“Next”按钮,出现如图 4 所示的界面。在此界面中选择需要创建界面的基类(base class)。有 3 种基类可以选择:

  1. QMainWindow 是主窗口类,主窗口具有主菜单栏、工具栏和状态栏,类似于一般的应用程序的主窗口;
  2. QWidget 是所有具有可视界面类的基类,选择 QWidget 创建的界面对各种界面组件都可以 支持;
  3. QDialog 是对话框类,可建立一个基于对话框的界面;

在此选择 QMainWindow 作为基类,自动更改的各个文件名不用手动去修改。勾选“创建界面”复选框。这个选项如果勾选,就会由 Qt Creator 创建用户界面文件,否则,需要自己编程手工创建界面。
项目的文件组成和管理

完成了以上新建项目的步骤后,在 Qt Creator 的左侧工具栏中单击“编辑”按钮,可显示如图 5 所示的窗口。


项目管理与文件编辑界面
 

在项目名称节点下面,分组管理着项目内的各种源文件,几个文件及分组分别为以下几项:

  • Demo.pro 是项目管理文件,包括一些对项目的设置项。
  • Headers 分组,该节点下是项目内的所有头文件(.h),图 5 中所示项目有一个头文件 mainwindow.h,是主窗口类的头文件。
  • Sources 分组:该节点下是项目内的所有 C++源文件(.cpp),图 5 中所示项目有两个 C++ 源文件,mainwindow.cpp 是主窗口类的实现文件,与 mainwindow.h 文件对应。main.cpp 是主函数文件,也是应用程序的入口。
  • Forms 分组:该节点下是项目内的所有界面文件(.ui)。图 5 中所示项目有一个界面文件mainwindow.ui,是主窗口的界面文件。界面文件是文本文件,使用 XML 语言描述界面的组成。

双击文件目录树中的文件mainwindow.ui,出现如图 6 所示的窗体设计界面:
集成在 Qt Creator 中UI设计器
这个界面实际上是 Qt Creator 中集成的 Qt Designer。窗口左侧是分组的组件面板,中间是设计的窗体。在组件面板的 Display Widgets 分组里,将一个Label组件拖放到设计的窗体上面。双击刚刚放置的 Label 组件,可以编辑其文字内容,将文字内容更改为“Hello, World!”。还可以在窗口右下方的属性编辑器里编辑标签的 Font 属性,Point Size(点大小)更改为 12,勾选粗体。

项目的编译、调试与运行
项目编译器选择和设置界面

每个编译器又有 Build 和 Run 两个设置界面。在 Build 设置界面上,有一个“Shadow build” 复选框。如果勾选此项,编译后将在项目的同级目录下建立一个编译后的文件目录,目录名称包含编译器信息,这种方式一般用于使用不同编译器创建不同版本的可执行文件。如果不勾选此项,编译后将在项目的目录下建立“Debug”和“Release”子目录用于存放编译后的文件。

 
图标作用快捷键
弹出菜单选择编译工具和编译模式,如 Debug或 Release模式 
直接运行程序,如果修改后未编译,会先进行编译。即使在程序中设置了断点,此方式运行的程序也无法调试。Ctrl+R
项目需要以Debug模式编译,点此按钮开始调试运行,可以在程序中设置断点。若是以 Release模式编译,点此按钮也无法进行调试。F5
编译当前项目Ctrl+B


实例程序 Demo 运行时界面

linux工程创建

apt-get install g++ make    //需要g++和make

sudo apt-get install libgl1-mesa-dev //需要opengl

Qt项目管理文件

.pro文件

  1. QT += core gui
  2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  3. TARGET = samp2_1
  4. TEMPLATE = app
  5. SOURCES += \
  6. main.cpp \
  7. widget.cpp
  8. HEADERS += \
  9. widget.h
  10. FORMS += \
  11. widget.ui

Qt += core gui”表示项目中加入 core gui 模块。core gui 是 Qt 用于 GUI 设计的类库模块,如果创建的是控制台(Console)应用程序,就不需要添加 core gui。

greaterThan(Qt_MAJOR_VERSION, 4): Qt += widgets这是个条件执行语句,表示当 Qt 主版本大于 4 时,才加入 widgets 模块。

“TARGET = samp2_1”表示生成的目标可执行文件的名称,即编译后生成的可执行文件是 samp2_1.exe。

“TEMPLATE = app”表示项目使用的模板是 app,是一般的应用程序。

后面的 SOURCES、HEADERS、FORMS 记录了项目中包含的源程序文件、头文件和窗体文件(.ui 文件)的名称。这些文件列表是 Qt Creator 自动添加到项目管理文件里面的,用户不需要手动修改。当添加一个文件到项目,或从项目里删除一个文件时,项目管理文件里的条目会自动修改。

.ui文件

widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. namespace Ui {
  5. class Widget;
  6. }
  7. class Widget : public QWidget
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit Widget(QWidget *parent = 0);
  12. ~Widget();
  13. private:
  14. Ui::Widget *ui;
  15. };
  16. #endif // WIDGET_H

widget.cpp

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget::Widget(QWidget *parent) :
  4. QWidget(parent),
  5. ui(new Ui::Widget)
  6. {
  7. ui->setupUi(this);
  8. }
  9. Widget::~Widget()
  10. {
  11. delete ui;
  12. }

widget.ui 文件

widget.ui 是窗体界面定义文件,是一个 XML 文件,定义了窗口上的所有组件的属性设置、布局,及其信号与槽函数的关联等。用UI设计器可视化设计的界面都由 Qt 自动解析,并以 XML 文件的形式保存下来。在设计界面时,只需在 UI 设计器里进行可视化设计即可,而不用管 widget.ui 文件是怎么生成的。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ui version="4.0">
  3. <class>Widget</class>
  4. <widget class="QWidget" name="Widget">
  5. <property name="geometry">
  6. <rect>
  7. <x>0</x>
  8. <y>0</y>
  9. <width>336</width>
  10. <height>216</height>
  11. </rect>
  12. </property>
  13. <property name="windowTitle">
  14. <string>My First Demo</string>
  15. </property>
  16. <widget class="QLabel" name="Lablabel">
  17. <property name="geometry">
  18. <rect>
  19. <x>100</x>
  20. <y>70</y>
  21. <width>141</width>
  22. <height>61</height>
  23. </rect>
  24. </property>
  25. <property name="font">
  26. <font>
  27. <pointsize>12</pointsize>
  28. <weight>75</weight>
  29. <bold>true</bold>
  30. </font>
  31. </property>
  32. <property name="text">
  33. <string>Hello,World</string>
  34. </property>
  35. </widget>
  36. <widget class="QPushButton" name="btnClose">
  37. <property name="geometry">
  38. <rect>
  39. <x>210</x>
  40. <y>150</y>
  41. <width>75</width>
  42. <height>23</height>
  43. </rect>
  44. </property>
  45. <property name="text">
  46. <string>Close</string>
  47. </property>
  48. </widget>
  49. </widget>
  50. <layoutdefault spacing="6" margin="11"/>
  51. <resources/>
  52. <connections>
  53. <connection>
  54. <sender>btnClose</sender>
  55. <signal>clicked()</signal>
  56. <receiver>Widget</receiver>
  57. <slot>close()</slot>
  58. <hints>
  59. <hint type="sourcelabel">
  60. <x>247</x>
  61. <y>161</y>
  62. </hint>
  63. <hint type="destinationlabel">
  64. <x>167</x>
  65. <y>107</y>
  66. </hint>
  67. </hints>
  68. </connection>
  69. </connections>
  70. </ui>

ui_widget.h 文件

ui_widget.h 是在对 widget.ui 文件编译后生成的一个文件,ui_widget.h 会出现在编译后的目录下,或与 widget.ui 同目录(与项目的 shadow build 编译设置有关)。

文件 ui_widget.h 并不会出现在 Qt Creator 的项目文件目录树里,当然,可以手工将 ui_widget.h 添加到项目中。方法是在项目文件目录树上,右击项目名称节点,在调出的快捷菜单中选择“Add Existing Files…”,找到并添加 ui_widget.h 文件即可。

注意,ui_widget.h 是对 widget.ui 文件编译后自动生成的,widget.ui 又是通过 UI 设计器可视化设计生成的。所以,对 ui_widget.h 手工进行修改没有什么意义,所有涉及界面的修改都应该直接在UI 设计器里进行。所以,ui_widget.h 也没有必要添加到项目里。

  1. /********************************************************************************
  2. ** Form generated from reading UI file 'widget.ui'
  3. **
  4. ** Created by: Qt User Interface Compiler version 5.9.1
  5. **
  6. ** WARNING! All changes made in this file will be lost when recompiling UI file!
  7. ********************************************************************************/
  8. #ifndef UI_WIDGET_H
  9. #define UI_WIDGET_H
  10. #include <QtCore/QVariant>
  11. #include <QtWidgets/QAction>
  12. #include <QtWidgets/QApplication>
  13. #include <QtWidgets/QButtonGroup>
  14. #include <QtWidgets/QHeaderView>
  15. #include <QtWidgets/QLabel>
  16. #include <QtWidgets/QPushButton>
  17. #include <QtWidgets/QWidget>
  18. QT_BEGIN_NAMESPACE
  19. class Ui_Widget
  20. {
  21. public:
  22. QLabel *label;
  23. QPushButton *btnClose;
  24. void setupUi(QWidget *Widget)
  25. {
  26. if (Widget->objectName().isEmpty())
  27. Widget->setObjectName(QStringLiteral("Widget"));
  28. Widget->resize(336, 216);
  29. label = new QLabel(Widget);
  30. label->setObjectName(QStringLiteral("label"));
  31. label->setGeometry(QRect(100, 70, 141, 61));
  32. QFont font;
  33. font.setPointSize(12);
  34. font.setBold(true);
  35. font.setWeight(75);
  36. label->setFont(font);
  37. btnClose = new QPushButton(Widget);
  38. btnClose->setObjectName(QStringLiteral("btnClose"));
  39. btnClose->setGeometry(QRect(210, 150, 75, 23));
  40. retranslateUi(Widget);
  41. QObject::connect(btnClose, SIGNAL(clicked()), Widget, SLOT(close()));
  42. QMetaObject::connectSlotsByName(Widget);
  43. } // setupUi
  44. void retranslateUi(QWidget *Widget)
  45. {
  46. Widget->setWindowTitle(QApplication::translate("Widget", "My First Demo", Q_NULLPTR));
  47. label->setText(QApplication::translate("Widget", "Hello\357\274\214World", Q_NULLPTR));
  48. btnClose->setText(QApplication::translate("Widget", "Close", Q_NULLPTR));
  49. } // retranslateUi
  50. };
  51. namespace Ui {
  52. class Widget: public Ui_Widget {};
  53. } // namespace Ui
  54. QT_END_NAMESPACE
  55. #endif // UI_WIDGET_H

查看 ui_widget.h 文件的内容,发现它主要做了以下的一些工作:

  1. 定义了一个类 Ui_Widget,用于封装可视化设计的界面。
  2. 自动生成了界面各个组件的类成员变量定义。在 public 部分为界面上每个组件定义了一个指针变量,变量的名称就是设置的 objectName。比如,在窗体上放置了一个 QLabel 和一个 QPushButton 并命名后,自动生成的定义是:

    QLabel *LabDemo;
    QPushButton *btnClose;

  3. 定义了 setupUi() 函数,这个函数用于创建各个界面组件,并设置其位置、大小、文字内容、字体等属性,设置信号与槽的关联。setupUi() 函数体的第一部分是根据可视化设计的界面内容,用 C++ 代码创建界面上各组件,并设置其属性。

    接下来,setupUi() 调用了函数 retranslateUi(Widget),用来设置界面各组件的文字内容属性,如标签的文字、按键的文字、窗体的标题等。将界面上的文字设置的内容独立出来作为一个函数 retranslateUi(),在设计多语言界面时会用到这个函数。

    setupUi() 函数的第三部分是设置信号与槽的关联,本文件中有以下两行:

    QObject::connect(btnClose, SIGNAL(clicked()), Widget, SLOT(close()));
    QMetaObject::connectSlotsByName(Widget);

    第1 行是调用 connect() 函数,将在 UI 设计器里设置的信号与槽的关联转换为语句。这里是将 btnClose 按键的 clicked() 信号与窗体 Widget 的 close() 槽函数关联起来,就是在图 4 中设置的信号与槽的关联的程序语句实现。这样,当单击 btnClose 按钮时,就会执行 Widget 的 close() 槽函数,而 close() 槽函数的功能是关闭窗口。

    第 2 行是设置槽函数的关联方式,用于将 UI 设计器自动生成的组件信号的槽函数与组件信号相关联。

    所以,在Widget 的构造函数里调用 ui->setupUI(this),就实现了窗体上组件的创建、属性设置、信号与槽的关联。
  4. 定义 namespace Ui,并定义一个从Ui_Widget 继承的类Widget。

    namespace Ui {
        class Widget: public Ui_Widget {};
    }

提示:ui_widget.h 文件里实现界面功能的类是 Ui_Widget。再定义一个类 Widget 从 Ui_Widget 继承而来,并定义在 namespace Ui 里,这样 Ui:: Widget 与 widget.h 里的类 Widget 同名,但是用 namespace 区分开来。所以,界面的 Ui:: Widget 类与文件 widget.h 里定义的 Widget 类实际上是两个类,但是 Qt 的处理让用户感觉不到 Ui:: Widget 类的存在,只需要知道在 Widget 类里用 ui 指针可以访问可视化设计的界面组件就可以了。
 

  1. #include "widget.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv); //定义并创建应用程序
  6. Widget w; //定义并创建窗口
  7. w.show(); //显示窗口
  8. return a.exec(); //应用程序运行
  9. }

VS中使用Qt

安装:Visual Studio Add-in 2.0.0 for Qt5 MSVC 2015

在 Visual Studio 2015 里创建一个 Qt GUI 应用程序项目。创建项目时选择项目模板的对话框如图 1 所示,选择创建 Qt GUI Application 项目,根据向导提示完成项目 Demo 的创建。

在首次使用 Visual Studio 编译 Qt 项目之前,必须先进行一些设置,否则会提示没有设置 Qt 版本,无法编译项目。


、首先要设置 Qt 版本。单击 Visual Studio 菜单项Qt VS Tools→Qt Options,出现如图 2 所示的对话框。Qt Versions 页面显示了可以使用的 Qt 版本(这是已经设置好的界面),在未设置 之前,框里是空白的。

单击“Path”文本框后面的按钮,在出现的目录选择对话框里选择 Qt 5.9.1 安装目录下的 MSVC 编译器目录,如D:\Qt\Qt5.9.1\5.9.1\msvc2015_64。选择目录后,Version name 编辑框里会自动出现版本名称,可以修改此名称为意义更明显的名字,如“msvc2015-64bit”。

 

然后,再单击 Visual Studio 菜单项Qt VS Tools→Qt Project Settings,为项目设置 Qt 版本,出现如图 4 所示的对话框。在此对话框的 Properties 分页下的列表框里,在 Version 下拉列表框中选择某个 Qt 版本。

 

 

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

闽ICP备14008679号