1. 程式人生 > >一個簡單的Qt詞典程序

一個簡單的Qt詞典程序

from string class label c++ stl ips ner ont 實例

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 "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/1Hw2o9bQGQHRm_1tJlEGkfg

技術分享圖片

一個簡單的Qt詞典程序