一步步创建Qt Widget项目+TextFinder案例(摘自笔者2015年将出的《QT5权威指南》,本文为试读篇)



创建一个基于应用的QtWidget应用程序

这个手册描述了怎样使用QtCreater创建个一个小的Qt应用程序,Text
Finder.它是Qt工具Text Finder例子的简写版本。这个应用程序的用户界面通过使用Qt
Designer来构造生成。逻辑上来说,这个应用程序是通过代码编辑器上编写C++代码实现的。

 

创建Text Finder项目案例:

1选择File(文件)>
New Fileor Project
(新建文件或项目) > Application(应用程序)>
QtWidgets Application > Choose
(选择)

接着打开了项目介绍和位置窗口

2在名称的文本框中,填写TextFinder

3在创建路径的文本框中,键入项目文件存储路径,例如:E:\Examples,接着点击”下一步”(在Windows和Linux平台)或者”继续”(在OS
X平台上)。

构建套件对话框打开了:

4为运行您的项目选择构建套件,接着点击”下一步”或者”继续”

注意:如果一个套件在”工具
> 选项 >编译和运行 >Kits”,这个对话框将会跳过。

接着”类信息”对话框打开了:

5在类名的文本框中,TextFinder作为类名。

6在基类列表里,选择QWidget作为基类类型。

注意:头文件,源文件和界面文件将根据类名自动匹配。

7点击Next和继续。

接着”项目管理”窗口被打开:

      8检查项目设置,并且点击”完成”(在Windows和Linux平台)或者”继续”(在OS
X平台)

TextFinder项目包含以下文件:


textfinder.h

截图:

textfinder.cpp

main.cpp

textfinder.ui

TextFinder.pro

添加缺少部分:

开始设计用户界面,添加缺少的代码,实现查找功能。

设计用户界面:

1在Qt Creater中的Edit编辑模式里,双击textfind.ui文件,转到Qt设计界面。

2拖拽下面的部件到界面中:

Label(QLabel)

Line Edit(QLineEdit)

PushButton(QPushButton)

注意:如果想快速定位这些部件,可以使用在工具栏上部的搜索窗口。

例如,查找Label部件,可以输入Label进行查找:

      3双击Label部件,键入文本”keyword”

      4双击Push Button部件,键入文本”Find”

      5在属性面板,改变objectName为findButton

      6
按Ctrl+A(或者Cmd+A)选中这些部件,点击”水平布局”(在Linux和Window平台上按Ctrl+H,在OS
X平台上按Ctrl +Shift + H)应用一个水平布局(QHBoxLayout)。

      7拖拽一个Text Edit部件(QTextEdit)到界面上去。

      8选中设计窗口空白区域,点击”垂直布局”(或按Ctrl
+ L)来应用一个水平布局(QVBoxLayout)。

应用水平和垂直布局确保在不同的屏幕上的自适应。

9当用户点击Find按钮的时候,将调用一个find方法,如果您想实现这个功能,您可以使用Qt中的信号(signals)和槽(slots)机制。当特定的事件发生时候一个信号(signal)将被发散(emitted),与此同时,一个槽函数(slot)将会被调用来响应这个特定的信号。在Qt
Widgets的Qt Designer中有一些预先定义好的信号(signals)和槽(slots)可以供您直接使用。接下来为find函数添加槽:

  • 右击”Find”按钮打开一个右键菜单。
  • 选择 “转到槽” >clicked(),接着选择.

    一个私有类型的槽函数on_findButton_clicked()被添加到了头文件textfinder.h中去,一个私有的函数TextFinder::on_findButton_clicked()被添加到源文件textfinder.cpp源文件中。

截图如下:

头文件部分截图:

      10按Ctrl+S(或Cmd
+ S)保存您的改变。

      如果想了解更多关于通过QtDesigner来设计界面的信息,查看Qt
Designer手册(http://doc.qt.io/qt-5/qtdesigner-manual.html)

 

完善头文件:

   在textfinder.h文件里面已经有了必要的头文件#include,一个构造函数,一个析构函数,和一个UI对象,你需要添加私有的函数loadTextFile(),读取并且显示文本的中的内容到QTextEdit中去。

      1在项目面板中的编辑视图,双击textfinder.h文件,打开并且编辑它。

      2添加私有函数到私有区域,在Ui::TextFinder指针后面,插入一下的代码片段

privateslots:

   voidon_findButton_clicked();

 

private:

   Ui::TextFinder*ui;

   voidloadTextFile();
//加载文件的方法

完善源码文件:

      现在头文件已经完成了,接下来转到源文件:textfinder.cpp.

      1在项目面板中的编辑视图,双击源文件textfinder.cpp,开始编辑。

      2在loadTextFile里面,加载一个文件使用QFile,读取文件内容使用QTextStream,显示文本内容到textEdit使用QTextEdit::setPlainText()函数,注意的是若想使用QFile和QTextStream,需要导入如下头文件:

#include <QFile>

#include <QTextStream>

      3loadTextFile函数的内容如下:

voidTextFinder::loadTextFile()

{

   //加载资源文件input.txt,关于资源文件的加载将下文讲述

   QFileinputFile(":/input.txt");

   inputFile.open(QIODevice::ReadOnly);

   

   QTextStreamin(&inputFile);

   QStringline=in.readAll();

   inputFile.close();

   

   ui->textEdit->setPlainText(line);

   QTextCursorcursor=ui->textEdit->textCursor();

   cursor.movePosition(QTextCursor::Start,QTextCursor::MoveAnchor,1);

}

      4在on_findButton_clicked()槽函数里,通过QTextEdit::find()方法可以查找在文本文件中的字符串。下面是代码片段:

voidTextFinder::on_findButton_clicked()

{

   QStringsearchString=ui->lineEdit->text();

   ui->textEdit->find(searchString,QTextDocument::FindWholeWords);

}

      5
当这两个方法都完成之后,在构造方法里添加一行代码来调用loadTextFile(),代码片段如下:

TextFinder::TextFinder(QWidget*parent):

   QWidget(parent),

   ui(newUi::TextFinder)

{

   ui->setupUi(this);

   //调用加载文件的方法

   loadTextFile();

}

      on_findButton_clicked()槽函数将会被自动生成到ui_textfinder.h中下面的一行代码调用:

QMetaObject::connectSlotsByName(TextFinder);

创建资源文件:

      您需要一个资源文件(.qrc),这个资源文件嵌入了您输入的文本文件。这个文本文件可以是任意添加了一段文本的.txt文件。创建一个叫做input.txt的文件,并且将它存储在和源代码所在的同级目录里。

添加资源文件:

      1选择File (文件)>
New File or Project(新建文件或项目) > Qt>Qt Resource File(Qt资源文件)>
Choose;

选择位置对话框如下:

      2在名称文本框中,键入textfinder

      3在路径文本框中,键入E:\Examples\TextFinder,点击”下一步”或者”继续”。项目管理对话框打开了:

      4在”添加到项目”域,选择TextFinder.pro,点击完成。在代码编辑器中打开这个.qrc文件.

5右击textfinder.qrc,选择右键菜单中的addPrefix

      6在Prefix文本域里面,用斜线(/)替换掉默认的prefix.

      7右击textfinder.qrc,选择右键菜单中的”添加现有文件”。然后定位到input.txt文件所在的位置,添加进去。

编译和运行您的程序:

      至此为止,您已经有了所有必要的文件,您可以点击按钮来编译和运行您的程序了。截图如下:

 

时间: 2024-09-28 08:50:20

一步步创建Qt Widget项目+TextFinder案例(摘自笔者2015年将出的《QT5权威指南》,本文为试读篇)的相关文章

《精通移动App测试实战:技术、工具和案例》一1.7 创建一个Android项目

1.7 创建一个Android项目 前面已经完成了Android开发环境的搭建工作,现在就让我们一起来编写一个简单的Android程序.这里我们要实现一个两个整型数字相加的程序. 1.7.1 创建一个新的Android项目 启动Eclipse,单击"File > New > Android Application Project"菜单项,如图1-42所示. 1.7.2 如何填写Android项目信息 在弹出的图1-43所示界面中,"Application Name

myeclipse创建两个项目,用webservice实现请求返回数据

问题描述 myeclipse创建两个项目,用webservice实现请求返回数据 想写一个用myeclipse创建的两个项目,一个发送http请求,一个接收并返回数据,用webservice怎么写,我是初学,有没有具体步骤或者案例,求大神指教啊~~ 解决方案 http://pan.baidu.com/s/1hrpiFEO 密码:hncx 解决方案二: 你好,确认一下你是不是想做一个webservice服务器,一个webservice客户端?是不是这个意思,然后客户端去访问服务器 解决方案三: 如

eclipes创建一个web项目web.xml不能自动更新的原因(web.xml和@WebServlet的作用)

在eclipse中创建一个Web项目的时候,虽然有web.xml生成,但是再添加Servlet类文件的时候总是看不见web.xml的更新,所以异常的郁闷!上网查了查,原来我们在创建Web项目的时候,会弹出一个对话框,"Dynamic web module version"这个选项默认成了3.0,按照老规范,应该是在eclipse的WebContent \ WEB-INF \ 目录下创建web.xml的.而新规范是可以不用web.xml的,如tomcat 7.0就支持新规范,这样相关的s

android如何在activity 中启动和创建一个widget?

问题描述 如题android如何在activity 中启动和创建一个widget? 问题补充:飞雪无情 写道 解决方案 要是在activity创建一个桌面上的widget的话 我试过是不行的.但是可以实现widget里创建一个activity.解决方案二:dialog也是一种widget,都差不多的.按你说的这个意思就是编程的方式了,不用xml 布局文件,你可以这样写public class HelloAndroid extends Activity { /** Called when the

如果没有Visual Studio 2015,我们如何创建.NET Core项目 ?

对于.NET开发人员来说,我们已经习惯了VS这个世界上最强大的IDE,所以对他们来说,项目的创建直接利用安装到VS中相应的项目模板即可.当.NET Core跨出了Windows的围栏,正式拥抱其他平台,意味着VS已经不再是唯一的IDE.于此同时,.NET Core充分借鉴了目前非常流行的基于"脚手架(Scaffolding)"的源文件生成方式,在它的核心命令行"dotnet"也添加了脚手架的命令行开关.除此之外,.NET Core真正对社区敞开胸怀,我们可以直接利用

使用PhoneGap命令行工具创建IOS PhoneGap项目及无证书真机调试

       在使用PhoneGap2.0及以上版本的时候,发现无法像低版本那样直接使用xcode来创建一个新的项目,只能通过PhoneGap的命令行工具来进行创建.        准备工作:        首先,准备好mac的环境和xcode的安装,地球人都知道.        然后得确定你的xcode已安装了Command Line Tools,如果不会安装的可以直接百度,上面有很多教程,这里就不多说了.        接着,下载好最新版本(我使用的是phonegap-2.4.0,此教程用于

qt中如何根据类名动态创建qt默认的控件类实例

问题描述 qt中如何根据类名动态创建qt默认的控件类实例 7C 需要根据从外部读取类名来创建类的实例,类大多为qt自带的控件类,如QWidgetQLineEdit等.有没有不用继承这些类就可以动态创建的方法? 解决方案 int id = QMetaType::type(""MyClass"");if (id != 0) {void *myClassPtr = QMetaType::construct(id);...QMetaType::destroy(id myCl

安卓开发-我用安卓1.6创建了一个项目,layout下面什么都没有~怎么回事~

问题描述 我用安卓1.6创建了一个项目,layout下面什么都没有~怎么回事~ 正在学安卓开发,但是为什么只有选择4.4版本的安卓SDK才能自动创建Activity.我用安卓1.6创建了一个项目,layout下面什么都没有~怎么回事~

tomcat-新手学习,创建一个网络项目时遇到的的tomca问题,谢谢指导

问题描述 新手学习,创建一个网络项目时遇到的的tomca问题,谢谢指导 新手学习中,当我在用eclipes ee 4.5 时,如果数据库打开的话,tomcat 8.0总是出现已被占用,出现这样的信息:Port 8080 required by Tomcat v8.0 Server at localhost is already in use. The server may already be running in another process, or a system process may