⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ndict.cpp

📁 Motorola E680I QtE 词典软件NDIct源码。
💻 CPP
字号:
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include "Dict.h"
#include "dirview.h"
#include "xpm.h"
#include "PhoneticLabel.h"
#include <stdio.h>
char* filename;//="/mmc/mmca1/dict/LDPW_ECCE.pdb";
//char *filename;
#include <zapplication.h>
#include <zmainwidget.h>
#include <ZScrollView.h>
#include <zmessagebox.h>
#include <ezxres.h>
#include <qlineedit.h>
#include <qlistbox.h>
#include <qtextcodec.h>
#include <ezxutilcst.h>
#include <zmultilineedit.h> 
#include <zglobal.h>
#define  IMID_PINYIN_KB   QUuid( 0x637a8a14, 0xaf98, 0x41da, 0x96, 0x9a, 0x2b, 0xd1, 0x6e, 0xcd, 0x00, 0x10) 
#define  IMID_ENGLISH_KB   QUuid( 0x637a8a14, 0xaf98, 0x41da, 0x96, 0x9a, 0x2b, 0xd1, 0x6e, 0xcd, 0xa8, 0x00) 
#define HWRCLASS   0x6919720a  
#define IMID_HANDWRITING_KB   QUuid( HWRCLASS, 0xaf98, 0x41da, 0x96, 0x9a, 0x2b, 0xd1, 0x6e, 0xcd, 0xa4, 0x10)  
#define  IMID_UNDEFINED   QUuid() 
static QTextCodec* gbk_codec = QTextCodec::codecForName("GBK");
static QString un_gbk(const char*ChnStr)
{
    return gbk_codec->toUnicode(ChnStr);
}
static QTextCodec* unic_codec = QTextCodec::codecForName("GBK");
static QCString un_unic(const QString ChnStr)
{
    return unic_codec->fromUnicode(ChnStr);
}

class ShowWidget : public ZMainWidget{
Q_OBJECT
public slots:
	void Hide()
	{
		this->hide();
	};
public:
	ZMultiLineEdit* showEdit;
	PhoneticLabel* phLabel;
	QLineEdit* wdEdit;
	ZScrollView* sv;
	ShowWidget(QWidget* parent):ZMainWidget(parent, "show",1)
	{		
		sv=(ZScrollView*)getContentWidget();
//sv->viewport()
		wdEdit = new QLineEdit(sv->viewport());
		wdEdit->setFrame(false);
		wdEdit->setGeometry(0,0,240,25);
		wdEdit->setReadOnly(true);
		
//		//wdEdit->setFixedSize (QSize(240,25));
//		
		phLabel = new PhoneticLabel(sv->viewport());
		phLabel->setGeometry(0,25,240,50);
//		phLabel->setFixedSize (QSize(240,25));
		phLabel->convPhone=myConvPhone;
		
		showEdit = new ZMultiLineEdit(sv->viewport(),false,-1, "show");
		showEdit->setReadOnly(true);
		showEdit->setGeometry(0,50,240,190);
		//showEdit->setFixedSize (QSize(240,190));
		showEdit->setUnderline(false);
		showEdit->setWordWrap(ZMultiLineEdit::NoWrap );
		
		sv->addChild(wdEdit,0,0,true);
		sv->addChild(phLabel,0,25,true);
		sv->addChild(showEdit,0,50,true);
		//ZApplication::setMouseMode(showEdit,1);
		UTIL_CST *cp = new UTIL_CST(this, "CST");
		setCSTWidget(cp);
		cp->show();
		ZPushButton *wp;
		wp = cp->getRightBtn();
		connect(wp, SIGNAL(clicked()), this, SLOT(Hide()));
		wp = cp->getLeftBtn();
		wp->setEnabled(false);
		wp = cp->getMidBtn();
		wp->setText(un_gbk("确定"));
		connect(wp, SIGNAL(clicked()), this, SLOT(Hide()));
	};
	void SetText(QString wd, QString ph, QString exp)
	{
		wdEdit->setText(wd);
		phLabel->setText(ph);
		showEdit->clear();
		showEdit->setText(exp);
	}
};
class MyWidget : public ZMainWidget{
	Q_OBJECT
private:
		Dict dic;
		int menuID_About,menuID_SetPath,menuID_ShowDict;
		char* getLine(FILE *in);
		QUuid curIMN;
		QValueList<QUuid> flist1;
public:
		ShowWidget* sw;
		QLineEdit* input;
		QListBox* list;
    MyWidget();
    void InitialCST(ZMainWidget* const mw);
    void openDict();
public slots:
		void hideInputWidget();
    void Input(const QString & str);
    void Selected(QListBoxItem * item);
    void EnterPress();
    void Clear();
    void menuSelect(int id);
    void setPath();
    void readPath();
    
};

void MyWidget::hideInputWidget()
{
	QUuid imn=getCurrentInputMethodName(false);
	if(imn!=IMID_UNDEFINED)
	{
		curIMN=imn;
		setInputMethods(input,curIMN, flist1, ZGlobal::KBF_NONE);
	}
	ZMainWidget::hideInputWidget();
}
MyWidget::MyWidget():ZMainWidget(true, NULL, "ezxdict", 0)//ZMainWidget( true, 0 )
{
	getContentWidget();
	sw=new ShowWidget(NULL);
	input = new QLineEdit(this,"input1");
	input->setGeometry(0,0,240,25);
	ZApplication::setMouseMode(input,1);	
	list = new QListBox(this);
	list->setGeometry(0,25,240,215);
	connect(input, SIGNAL(textChanged ( const QString & )), this, SLOT(Input ( const QString & ))); 
	connect(input, SIGNAL(returnPressed ()),this, SLOT(EnterPress()));
	connect(list, SIGNAL(clicked ( QListBoxItem * )), this, SLOT(Selected ( QListBoxItem * )));
	InitialCST(this);
	
	flist1.append(IMID_PINYIN_KB);
	flist1.append(IMID_ENGLISH_KB);
	flist1.append(IMID_HANDWRITING_KB);
	setInputMethods(input,IMID_ENGLISH_KB, flist1, ZGlobal::KBF_NONE);
	//setFavoriteInputMethods(flist1);
	//setInputMethod(IMID_ENGLISH_KB);
	//setInputMethod(IMID_ENGLISH_KB,ZGlobal::KBF_NONE);
	//std::cout<<"Initial finished\n";
}

void MyWidget::InitialCST(ZMainWidget* const  mw)
{
	ZPushButton *wp;
	QPopupMenu *pp;
	UTIL_CST *cp = new UTIL_CST(mw, "CST");
	setCSTWidget(cp);
	cp->show();
	
	wp = cp->getMidBtn();
	wp->setText(un_gbk("清空"));
	connect(wp, SIGNAL(clicked()), this, SLOT(Clear()));
	
	wp = cp->getRightBtn();
	connect(wp, SIGNAL(clicked()), qApp, SLOT(slotQuickQuit()));
	
	pp = new QPopupMenu(cp, NULL);	
	menuID_SetPath=pp->insertItem(un_gbk("设置字典路径"));
	menuID_ShowDict=pp->insertItem(un_gbk("当前字典名称"));
	menuID_About=pp->insertItem(un_gbk("关于"));

	connect(pp, SIGNAL(activated(int)), SLOT(menuSelect(int)));
	wp = cp->getLeftBtn();
	wp->setPopup(pp);
	
}

void MyWidget::Input(const QString & str)
{
	//std::cout << "key words changed\n";
	list->clear();
	
	char **word_list;
	int len=dic.GetWordList(un_unic(str),&word_list);
	for(int i=0;i<len;i++)
	{
	list->insertItem( un_gbk(word_list[i]) );
	delete[] word_list[i];
	}
	if(len>0)
		delete[] word_list;
}

void MyWidget::Selected(QListBoxItem * item)
{
	if(item)
	{
		char *exp;
		if(dic.GetExp(un_unic(item->text()),&exp)!=-1)
		{
			//sw->SetText(un_gbk(exp)); 
			QString tmp=un_gbk(exp);
			QString wd,ph,ex;
			//printf("str len:%u\n",len);
			int start=0;
			int end=tmp.find("\n");
			do
			{
				wd=tmp.mid(start,end-start);
				if(end==-1)
				{
					ph=ex="";
					break;
				};
				start=end+1;
				end=tmp.find("\n",start);
				ph=tmp.mid(start,end-start);
				if(end==-1)
				{
					ex="";
					break;
				}
				start=end+1;
				ex=tmp.mid(start);
			}
			while(0);
			if(ph.isEmpty())
			{
				ph="[ ]";
			}
			else
			{
				if(ph[0]!='[')
				{
					ex=ph+ex;
					ph="[ ]";
				}
			}
			sw->SetText(wd,ph,ex);
			sw->show();
			delete[] exp;
		}
	}
}
void MyWidget::EnterPress()
{
	if(list->text(0))
	{
		char *exp;
		if(dic.GetExp(un_unic(list->text(0)),&exp)!=-1)
		{
			QString tmp=un_gbk(exp);
			QString wd,ph,ex;
			//printf("str len:%u\n",len);
			int start=0;
			int end=tmp.find("\n");
			do
			{
				wd=tmp.mid(start,end-start);
				if(end==-1)
				{
					ph=ex="";
					break;
				};
				start=end+1;
				end=tmp.find("\n",start);
				ph=tmp.mid(start,end-start);
				if(end==-1)
				{
					ex="";
					break;
				}
				start=end+1;
				ex=tmp.mid(start);
			}
			while(0);
			if(ph.isEmpty())
			{
				ph="[]";
			}
			else
			{
				if(ph[0]!='[')
				{
					ex=ph+ex;
					ph="[]";
				}
			}
			sw->SetText(wd,ph,ex);
			sw->show();
			delete[] exp;
		}
	};
}
void MyWidget::Clear()
{
	input->clear();
	input->setFocus();
	list->setContentsPos(0,0);
	invokeInputWidget();
}
void MyWidget::menuSelect(int id)
{
	if(id== menuID_About){
		ZMessageBox::timerInformation(this, NULL, un_gbk("   简单电子词典\n\n  谨以此词典送给爱我的娜娜\n    08年于工程大学\nsun_yanteng@hotmail.com\n您可以自由使用、修改本软件,但请勿用于商业用途!"), 15,"OK");
	}
	else if(id== menuID_SetPath){
		 setPath();
	}
	else if(id==menuID_ShowDict){
		QString mesg=un_gbk("当前词典:\n");
		mesg.append(un_gbk(dic.dictName));//un_gbk("\n已经打开"));
		sw->SetText("","",mesg);
		sw->show();
	}
}
void MyWidget::setPath()
{
	QString tmp(filename);
	int index=tmp.findRev("/");
	if(index!=-1)
		tmp=tmp.left(index);
	else
		tmp="/";
	QString ret=DirectoryView::getSaveFileName(this,tmp);
	QCString buf=ret.utf8();
	//printf("len:%d\n",buf.length());
	if(buf.length()!=0)
	{
		FILE *fout=fopen(QString(getenv("APPPATH"))+"/config","wb");
		fwrite(buf,1,buf.length(),fout);
		fclose(fout);
		openDict();
	}
	else
	{
		if(!dic.OpenDict(filename))
			exit(0);
	}
}
char* MyWidget::getLine(FILE *in)
{
	//printf("start reading\n");
	int i=0;
	char *buf=new char[4096];
	while(buf[i]=fgetc(in))
	{
		if(i>4096) break;
		if(buf[i]==0xff) break;                      
		i++;
	}
	buf=(char *)realloc(buf,i+1);
	if(!buf) printf("none buffer!");
	buf[i]='\0';
	return buf; 
}
void MyWidget::readPath()
{
	FILE *fin=fopen(QString(getenv("APPPATH"))+"/config","rb");
	if(fin)
	{
	filename=getLine(fin);
	printf("%s\n",filename);
	fclose(fin);
	}
}
void MyWidget::openDict()
{
	readPath();
	while(!dic.OpenDict(filename))
	{
		ZMessageBox::information(this, NULL, un_gbk("请选择词库"),"OK");
		setPath();
		readPath();
	}
	input->setFocus();
	QString ts=input->text();
	input->clear();
	input->setText(ts);
	Input(ts);
}
int main (int argc, char** argv) 
{
ZApplication app (argc, argv); 
QString appPath = QString( app.argv()[0] );
int slash = appPath.findRev( "/" );
if (slash != -1) {
  appPath = appPath.left( slash );
  if ( !appPath.contains("NDict") ) {
    appPath = QString( getenv("PWD") );
  }
  appPath = "APPPATH=" + appPath;
  app.setEnv( appPath );
  //std::cout<<appPath.utf8()<<"\n";
}
MyWidget* w = new MyWidget;
w->show();
w->openDict();
app.setMainWidget (w);
return app.exec();
}

#include "NDict.moc"

//int main(int argc, char* argv[])
//{
//	Dict dic;
//	dic.OpenDict(filename);
//	char **list;
//	int len=dic.GetWordList("student",&list);
//	for(int i=0;i<len;i++)
//	{
//		printf("%s\n",list[i]);
//	}
//	char *exp;
//	len=dic.GetExp("student",&exp);
//	printf("%s",exp);
//	printf("Done!");
//	return 0;
//}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -