QT5.7.0 学习写一个关键词查找器

Posted on 2018-07-18

因为一天到晚都是利用第三方的可视化,或者直接在命令行里看程序结果,决定学一下QT,看了很多教程,由于版本的变动感觉都不适用,(比如人家一上来就是新建一个QtApplication,但我的qtcreator根本没有。)还有太多都是从理论讲起,看的没有效率,索性找了官网的Tutorial动手。

我现有的版本是QT5.7.0。因为有了Widgets机制,还有Qtdesigner,画界面比较简单。

官方示例电梯:http://doc.qt.io/qtcreator/creator-writing-program.html

新建工程

1、选择 文件->新建项目或工程->Application->Qt Widgets Application->Choose.

开启一项目介绍对话框,用来指定项目名称和路径

http://7xq62e.com1.z0.glb.clouddn.com/pic/18-7-18-1.png

2、命名为”TextFinder”

3、来到下一个窗口,下一步

4、指定类名。其中Bass class是Qwidget(这里我选错了,不过没有影响 )。下一步

http://7xq62e.com1.z0.glb.clouddn.com/pic/18-7-18-3.png

一直到Finish(完成)就创建好了项目

注意里面的一些文件可能被隐藏,点击开来,里面有

  • textfinder.h
  • textfinder.cpp
  • main.cpp
  • textfinder.ui
  • textfinder.pro

界面设计

1、在Edit(编辑)模式下,双击textfinder.ui,就会自动打开 Qt Designer. 2、 Qt Designer可以让你自由的设计出还不错的界面,直接拖拽一些Widgets到表格里

  • Label(Qlabel)
  • Line Edit(QLine Edit)
  • Push Button(Push Button)

初学者其实还不知道这都是干什么的,我想是界面的一些初级的控件。比如文本框、按钮、标签。括号对应的应该是Widgets之前的版本。

如果你不知道在哪里找到。左侧边栏有搜索,可以找到

3、双击Label widget并输入keyword

4、双击PushButton 输入text Find 按钮

5、在属性面板那把Objectname变成findButton

6、 Ctrl+A (or Cmd+A) 选中组件们,用快捷键Ctrl+H on Linux or Windows or Ctrl+Shift+H on macOS 来使布局更合理(主要是水平对齐)

7、拖拽一个Text Edit 到表格中,调整布局

8、 Ctrl+L快捷键调整布局

9、雏形出来了,这个例子的功能就是给定一个词语,按下 Find按钮以后.找到文本文件中出现的单词。就此就要谈到QT中很出名的信号-槽机制。当一个特定的事件发生以后,就会传输出去,而就会回应接收这个信号并给出下一步动作。QtWidgets有预先定义的信号和槽,使得你可以直接在QtDesigner连接他们:

  • 右键点击Find
  • 选择转到槽 clicked(), 并选择OK

10、 点击 Ctrl+S (or Cmd+S) 保存

最后一个大致的界面如下:

头文件代码完善

1、textfinder.h 中写代码

2、添加私有函数,在Ui::TextFinder 指针后面。

private slots:
    void on_findButton_clicked();

private:
    Ui::TextFinder *ui;
    void loadTextFile();

源文件代码完善

1、在项目中选择 **textfinder.cpp打开

3、利用 QFile 完成文本的加载。通过 QTextStream 来读写文件,最后把文本呈现在textEdit

void TextFinder::loadTextFile()
{
    QFile inputFile(":/input.txt");
    inputFile.open(QIODevice::ReadOnly);

    QTextStream in(&inputFile);
    QString line = in.readAll();
    inputFile.close();

    ui->textEdit->setPlainText(line);
    QTextCursor cursor = ui->textEdit->textCursor();
    cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor, 1);
}

3、记得在textfinder.cpp 开头添加

#include <QFile>
#include <QTextStream>

4、在 on_findButton_clicked() 槽函数中,利用QTextEdit::find() 函数取提取待搜索的目标string.

void TextFinder::on_findButton_clicked()
{
    QString searchString = ui->lineEdit->text();
    ui->textEdit->find(searchString,QTextDocument::FindWholeWords);
}

5、一旦这些函数都写好了,在构造函数里调用loadTextFile() 就可以了

TextFinder::TextFinder(QWidget *parent)
    : QWidget(parent), ui(new Ui::TextFinder)
{
    ui->setupUi(this);
    loadTextFile();
}

on_findButton_clicked() 之后就会在由 uic generated ui_textfinder.h 文件中的这句被自动调用

QMetaObject::connectSlotsByName(TextFinder);

创建资源文件

需要在资源文件 resource file (.qrc) 中引入参考的输入文档。就以.txt为例。在textfinder 文件夹下新建一个叫做 input.txt 的文档,之后添加进来

1、 File > New File or Project > Qt > Qt Resource File > Choose

2、命名为textfinder

3、下一步

4、选择 TextFinder.pro 然后点击完成来到代码编辑代码

5、点击textfinder.qrc, 添加>添加前缀

6、把默认前缀改成(/)

7、点击添加文件,添加input.txt

然后就调试运行啦:.输入某个单词,就能找到出现过的地方

自己写一个

我学习过这个例子以后,自己写了一个向量计算器,因为,只要搞明白,一旦发生了什么事件,改由什么函数做出相应,就很容易改写了。还有明白什么wighets对应显示什么。在QtDesigner中看一看就能知道:

这样就很快改出来了。因为我不需要再Load文本,就去掉了loadText()函数,直接做了如下的改动。

void CrossProductCompute::on_findButton_clicked()
{
    double v1x = ui->lineEdit->text().toDouble();
    double v1y = ui->lineEdit_3->text().toDouble();
    double v1z = ui->lineEdit_5->text().toDouble();
    double v2x = ui->lineEdit_2->text().toDouble();
    double v2y = ui->lineEdit_4->text().toDouble();
    double v2z = ui->lineEdit_6->text().toDouble();

    //计算叉乘
    double resx,resy,resz;
    resx =  v1y * v2z - v1z * v2y;
    resy = -v1x * v2z + v1z * v2x;
    resz =  v1x * v2y - v1y * v2x;

    //计算点乘
    double dot_res;
    
    dot_res = v1x*v2x+v1y*v2y+v1z*v2z;
    
    ui->lineEdit_7->setText(QString::number(resx));
    ui->lineEdit_9->setText(QString::number(resy));
    ui->lineEdit_8->setText(QString::number(resz));
    ui->lineEdit_10->setText(QString::number(dot_res));
}

效果是这样的,可以计算两个向量的点乘和叉乘。


蚊子再小也是肉~
本站总访问量 本站访客数