此博客目的旨在让刚接触Qt开发的小伙伴理解Qt开发的基本操作,了解基本的UI设计过程,了解信号槽机制。本博客不涉及具体的原理讲解,有关具体的原理应自行探索。
在开始之前,要首先安装好VS2010及Qt4.8.6,可以按照以下教程进行安装:
VS2010下载:Visual Studio2010简体中文版/旗舰版安装教程-CSDN博客
Qt4及VS2010配置:【Qt】超详细!Qt4.8.6和VS2010的配置及使用_vs2010对应qt-CSDN博客
完成VS2010及Qt的配置以后,正式进入入门教程↓↓↓↓↓↓↓↓↓
1. 新建项目-需要实际操作
文件—新建—项目,选择Qt4 Projects,选择Qt Application,更改项目名称为introduction,完成项目创建。
2. 目录结构-此部分不需要实际操作
首先看一下目录结构,可以先主要关注:
From Files:ui文件。
Generated Files:.ui自动生成的文件,introduction.ui会自动生成ui_introduction.h文件。
Header Files: 放置头文件,以.h结尾。声明项目中使用的类、函数、变量、常量等。
Source Files: 实现项目中的逻辑功能。源文件中的代码通常会引用头文件,并实现其中声明的类和函数。
此次教程的主要流程:
- 在From Files中设计introduction.ui,设计好后在Generated Files中自动生成ui_introduction.h文件,运行项目,实现粘贴、删除功能。
- 在From Files中设计pasteBroad.ui,设计好后在Generated Files中自动生成ui_pasteBroad.h文件。在Header Files中创建pasteBroad.h文件,在Source Files中创建pasteBroad.cpp文件,编写pasteBroad.h、pasteBroad.cpp、introduction.h、introduction.cpp文件,实现父窗口打开子窗口的功能。
3. UI设计-需要实际操作
在From Files文件夹中,双击introduction.ui,进入Qt Designer(汉化版称 Qt设计师),执行以下设计:
①拖拽Vertical Layout垂直布局组件
②拖拽Text Edit 到 Vertical Layout当中
③依次拖拽三个Push Button到Vertical Layout当中
4.更改控件名称
双击控件,更改控件名称:粘贴、删除、打开。
注意:控件名称也可以通过属性编辑器进行修改,修改QAbstractButton中的text即可↓↓↓↓:
注意:如果找不到对应的视图,点击 视图-属性编辑器 即可↓↓↓↓↓。
注意(无需操作):应当留意每个控件对应的 objectName(可自行修改),可理解为控件ID:
控件 | objectName |
粘贴 | pushButton |
删除 | pushButton_2 |
打开 | pushButton_3 |
5.编辑信号/槽
点击上方的编辑信号/槽,依次进行以下操作:
①点击 粘贴按钮 并按住,拖动至Text Edit中,再松开鼠标。操作成功后两个控件会进行关联。
②点击 粘贴按钮(对应pushButton)中的clicked();点击textEdit中的paste()。这个操作代表:当点击粘贴按钮时,textEdit中会执行粘贴操作。
③点击 删除按钮 并按住,拖动至Text Edit中,再松开鼠标。操作成功后两个控件会进行关联。
④点击 删除按钮(对应pushButton_2)中的clicked(); 点击textEdit中的clear()。这个操作代表:当点击删除按钮时,textEdit中会清空文本。
6.生成ui_introduction.h代码
设计好introduction.ui后,保存(ctrl+s),关闭Qt Designer。在VS中右键点击项目,左键点击生成:这会将introduction.ui自动转换成ui_introduction.h的代码。
目录Generated Files中的代码由目录Form Files中的.ui生成,不依靠开发人员手动编写(除特殊情况)。可以简单看一下ui_introduction.h中的代码,这部分代表控件的创建↓↓↓↓↓↓:
这部分代表控件之间的信号槽机制↓↓↓↓↓↓:
注意:值得关注的是,在ui_introduction中,会生成以下代码,即namespace Ui中的代码。个人理解:objectName是控件的唯一标识,而introductionClass是窗口introduction.ui的唯一标识:
生成好了?那在输出栏中会有成功的标识↓↓↓↓↓如果你没有输出栏,那么在VS上方点击 视图-输出:
7.运行
运行项目,点击绿色三角并等待:
复制一段文本,进行演示:
————学够了可以撤退刷会抖音。接下来进行 打开窗口+手动编写信号槽 的教程——————
8.新建pasteBroad.ui
①双击From Files 中的introduction.ui,打开Qt Designer,点击 文件-新建-创建。
②此时新建了一个Dialog窗口,单击其中的控件,按回退键将其删除。
③在introduction窗口中按Ctrl+A全选,然后在Dialog窗口中按Ctrl+C进行复制。
④点击 编辑信号/槽,为按钮配置连接,此操作与5.编辑信号/槽中①②③④一致。
⑤按Ctrl+s进行保存,命名为 pasteBroad.ui。
⑥虽然将pasteBroad.ui保存了,但是Form Files中并没有出现。没关系,我们直接将pasteBroad.ui复制到Form Files中,嘿嘿,现在有了
9.生成ui_pasteBroad.h
①右键introduction项目,点击生成。
②查看ui_pasteBroad.h中的namespace,对应Dialog。
将其理解为:Dialog是pasteBroad.ui的标识,至此两个.ui文件有以下标识:
UI | 标识 |
introduction.ui | introductionClass |
pasteBroad.ui | Dialog |
10.创建.h和.cpp
还记得开发的基本流程嘛?编写.ui-->生成ui_XXX.h-->创建Header File中的.h文件,创建Source中的.cpp文件-->编写.h和.cpp。
现在我们创建以下文件:
①在Header Files中创建pasteBroad.h文件。右键Header Files-添加-新建项-Visual C++-头文件,输入名称pasteBroad,创建成功。
②在Source Files中创建pasteBroad.cpp文件。右键Source Files--添加--新建项--Visual C++--C++文件,输入名称pasteBroad,创建成功。
③编写pasteBroad.h的代码。必要部分添加了注释,其他部分请读者自行查阅理解。
#ifndef PASTEBROAD_H
#define PASTEBROAD_H
#include <QDialog>
#include "ui_pasteBroad.h" // ui生成的文件
class pasteBroad : public QDialog
{
Q_OBJECT
public:
pasteBroad(QWidget *parent = 0, Qt::WFlags flags = 0);
~pasteBroad();
private:
Ui::Dialog *ui; // 与ui_pasteBroad.h中的class Dialog: public Ui_Dialog {};指明当前类对应的UI为Dialog
};
#endif // PASTEBROAD_H
④编写pasteBroad.cpp代码。
#include "pasteBroad.h" // .cpp中只导入Header Files中的文件
pasteBroad::pasteBroad(QWidget *parent, Qt::WFlags flags)
: QDialog(parent, flags), ui(new Ui::Dialog) // 创建一个代表Dialog的ui
{
ui->setupUi(this);
}
pasteBroad::~pasteBroad()
{
delete ui;
}
⑤编写introduction.h代码:
#ifndef INTRODUCTION_H
#define INTRODUCTION_H
#include <QMainWindow>
#include "ui_introduction.h" // 导入自己对应的文件
#include "pasteBroad.h" // 这样可以获得
class introduction : public QMainWindow
{
Q_OBJECT
public:
introduction(QWidget *parent = 0, Qt::WFlags flags = 0);
~introduction();
private:
Ui::introductionClass *ui; // 创建一个代表introductionClass的ui
private slots:
void onOpenButtonClicked(); // 声明槽函数
};
#endif // INTRODUCTION_H
⑥编写introduction.cpp代码:
#include "introduction.h"
introduction::introduction(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags), ui(new Ui::introductionClass) // 创建一个代表introductionClass的ui
{
ui->setupUi(this); // this指的是当前对象实例
connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(onOpenButtonClicked())); // 槽函数,代表单击pushButton_3时,调用nOpenButtonClicked()。
}
introduction::~introduction()
{
delete ui;
}
void introduction::onOpenButtonClicked() {
pasteBroad *dialog = new pasteBroad(this); // 使用pasteBroad,因为我们头文件导入了introduction.h,而introduction.h中导入了pasteBroad.h。考虑:传入的this是什么?
dialog->exec(); // 显示对话框
}
到此我们的代码已经编写完了。
注意:本博客旨在帮助读者理解各个文件之间的基本联系,具体的代码请稳扎稳打稳扎稳打稳扎稳打地进行学习。
提供了以下图,以便读者理解: