一個簡單的Qt詞典程序


      C語言程序以低層系統編程見長,因此常用於嵌入式系統和操作系統編程,而C++則以GUI程序見長(兼容C程序是它的獨特優點)。說實話從使用C語言編寫非GUI程序到使用C++編寫GUI程序對很多初學者來說都是一個挑戰,一個小小的飛躍,使用Qt來編寫一個簡單的詞典翻譯程序可以說是一個很好的實例。

    算法設計:使用C++ STL中的map關聯容器,map的用法請參閱https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html,對應到Qt中就是QMap類,英文輸入作為鍵,中文翻譯作為值,這樣組成了一個鍵值對。首先從文件中讀取翻譯詞條到map容器中,再根據輸入的詞語查詢(回車查詢),如果查詢到了則輸出中文翻譯,沒有查詢到則輸出"Not found".

   界面設計:設計一個繼承QWidget的類,使用QLineEdit控件作為輸入框,使用QLabel控件作為翻譯顯示區,使用QLabel顯示一幅圖片以美化界面,三者通過QVboxLayout垂直排列並自動定位。

   整個項目由三個Qt文件構成,分別為widget.h, widget.cpp, main.cpp,具體代碼如下:

  widget.h

#ifndef WIDGET_H
#define WIDGET_H
//widget.h

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QMap>
#include <QString>

class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private slots:
    void translate();
    
private:
    QMap<QString, QString> mapDict;
    QString query;
    QLabel *label_output;
    QLabel *label_image;
    QLineEdit *lineEdit;
    void CreateDict(QMap<QString, QString>  *myDict);
};
#endif // WIDGET_H

widget.cpp

// widget.cpp
#include "stdio.h"
#include "widget.h" #include <QTextCodec> #include <QVBoxLayout> #include <QMessageBox> //打開字典文件,並讀取文件內容 void Widget::CreateDict(QMap<QString, QString> *myDict) { FILE *fp; char word[300], inter[300]; size_t wordNumber = 0; fp = fopen("raw-dict", "r"); if (!fp) { QMessageBox::information(this, tr("打開詞庫失敗"), tr("打開詞庫失敗!")); fclose(fp); return; } while (fgets(word, sizeof(word), fp) && fgets(inter, sizeof(word), fp)) { /* * 插入到字典中。 */ word[strlen(word) - 1] = '\0'; inter[strlen(inter) - 1] = '\0'; wordNumber++; (*myDict)[word]=inter; } fclose(fp); label_output->setText("***** Total number of words is "+QString::number(wordNumber)+" *****"); } Widget::Widget(QWidget *parent) : QWidget(parent) { /*QString filename("Tulips.jpg"); QImage *img = new QImage; if (!(img->load(filename))) // 加載圖像 { QMessageBox::information(this, tr("打開圖像失敗"), tr("打開圖像失敗!")); delete img; return; }*/ QPixmap img("Tulips.jpg"); label_output = new QLabel; label_output->setWordWrap(true); lineEdit = new QLineEdit; label_image = new QLabel; label_image->setAlignment(Qt::AlignCenter); //label_image->setPixmap(QPixmap::fromImage(img)); label_image->setPixmap(img); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(lineEdit); layout->addWidget(label_output); layout->addWidget(label_image); setLayout(layout); connect(lineEdit,SIGNAL(returnPressed()), this,SLOT(translate())); CreateDict(&mapDict); } Widget::~Widget() { } void Widget::translate() { query = lineEdit->text(); if(mapDict.find(query) != mapDict.end()) { label_output->setText(mapDict[query]); } else { label_output ->setText("Not found"); } }

main.cpp

//main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.setFixedSize(320,240);
    w.show();
    return a.exec();
}

  下面為程序截圖,源文件和程序參見鏈接: https://pan.baidu.com/s/1xFurnfisySfM9SnhyPwf0w 提取碼: c9qq


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM